From 1540a2c2defa6b364d5e23d37f9fe730857f4119 Mon Sep 17 00:00:00 2001 From: "drohne235@gmail.com" Date: Sun, 22 Jun 2014 09:10:49 +0000 Subject: [PATCH] =?UTF-8?q?admflash=20-=20plexbusroutinen=20eingef=C3=BCgt?= =?UTF-8?q?=20-=20sd=5Fdel=20-=20heartbeat-sound=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit belflash - per compilerflag wählbare monitorsettings eingefügt (57/60hz) basic.mod (propforth) - bei der installation von trios mit forth muss basic.mod nur noch eingefügt werden, damit wird automatisch geflasht und neu gestartet lib: - adm-enc28j60 eingefügt, treiber netzwerkchip - adm-socket eingefügt, netzwerksocket - adm-plx code ausgebaut - bel-vga monitorsettings - glob-con plexbus/lan-konstanten eingefügt - glob-led-engine neue lib für hbeat-led-pwm - gui-dlbox - redraw beschleunigt - gui-wbox - warnbox ist jetzt auch mit tab & esc bedienbar - m-glob-con - konstanten für sound und plexbus eingefügt reg-ios: - testfunktion für rtc - lan funktionen eingefügt - plexbus funktionen eingefügt - printblk - stringausgabe mit längenangabe system/administra: - admnet eingefügt system/regnatix: - fm - optimierungen und detailverbesserungen - perplex - plexbus tool zugefügt - regime - sysinfo zeigt jetzt auch devices am plexbus an - man - systemklänge angepasst, damit nicht ständig der heartbeat beim lesen läuft - ramtest - anpassungen maske/farben dokumentation: - neustrukturierung der texte --- bin/flash/admflash.binary | Bin 13404 -> 14356 bytes bin/flash/belflash.binary | Bin 7624 -> 7624 bytes bin/sdcard/reg.sys | Bin 9740 -> 9872 bytes bin/sdcard/system/admnet.adm | Bin 0 -> 21956 bytes bin/sdcard/system/admsys.adm | Bin 13404 -> 14356 bytes bin/sdcard/system/admtest.bin | Bin 8208 -> 8620 bytes bin/sdcard/system/basics.mod | 4 + bin/sdcard/system/beltest.bin | Bin 6384 -> 6796 bytes bin/sdcard/system/charmap.bin | Bin 2256 -> 2668 bytes bin/sdcard/system/eram.bin | Bin 7352 -> 7368 bytes bin/sdcard/system/flash.bin | Bin 7148 -> 7560 bytes bin/sdcard/system/fm.bin | Bin 7644 -> 8280 bytes bin/sdcard/system/fterm.bin | Bin 2660 -> 3072 bytes bin/sdcard/system/ftp.bin | Bin 0 -> 7448 bytes bin/sdcard/system/ftp.man | 39 + bin/sdcard/system/g0test.bin | Bin 5988 -> 6400 bytes bin/sdcard/system/hplay.bin | Bin 3996 -> 4408 bytes bin/sdcard/system/ipconfig.bin | Bin 0 -> 4996 bytes bin/sdcard/system/irc.bin | Bin 0 -> 13844 bytes bin/sdcard/system/keycode.bin | Bin 2184 -> 2596 bytes bin/sdcard/system/m.bin | Bin 3364 -> 3776 bytes bin/sdcard/system/man.bin | Bin 2720 -> 3156 bytes bin/sdcard/system/perplex.bin | Bin 0 -> 6164 bytes bin/sdcard/system/ramtest.bin | Bin 4276 -> 4668 bytes bin/sdcard/system/regime.bin | Bin 9740 -> 9872 bytes bin/sdcard/system/rom.bin | Bin 4368 -> 4780 bytes bin/sdcard/system/sfxtool.bin | Bin 6648 -> 7060 bytes bin/sdcard/system/splay.bin | Bin 3068 -> 3480 bytes bin/sdcard/system/sysconf.bin | Bin 4232 -> 4644 bytes bin/sdcard/system/sysconf.man | 36 +- bin/sdcard/system/tapecut.bin | Bin 3564 -> 3976 bytes bin/sdcard/system/time.bin | Bin 5808 -> 6220 bytes bin/sdcard/system/vga.bel | Bin 7624 -> 7624 bytes bin/sdcard/system/wplay.bin | Bin 3352 -> 3764 bytes bin/sdcard/system/yplay.bin | Bin 3352 -> 3764 bytes doku/1-einfache-installation.txt | 23 + doku/2-installation-mit-forth.txt | 66 + doku/3-regime-im-überblick.txt | 100 ++ doku/4-forth-im-überblick.txt | 135 ++ doku/5-lan.txt | 192 +++ doku/6-irc-client.txt | 149 +++ doku/FemtoBasic Manual.rtf | 797 ------------ doku/Thumbs.db | Bin 22528 -> 63488 bytes doku/TriOS - Logo 1.jpg | Bin 19783 -> 0 bytes doku/TriOS-1.jpg | Bin 41871 -> 0 bytes doku/TriOS.ods | Bin 14289 -> 0 bytes doku/bellatrix-steuercodes.ods | Bin 10833 -> 0 bytes doku/{TriOS - Logo 2.jpg => trios-logo.jpg} | Bin logbuch.txt => doku/x-logbuch.txt | 46 + lizenz.txt => doku/y-lizenz.txt | 3 +- flash/administra/admflash.spin | Bin 164028 -> 170620 bytes flash/bellatrix/belflash.spin | Bin 80206 -> 80912 bytes flash/regnatix/regflash.spin | Bin 583454 -> 583394 bytes forth/basics.mod | 4 + installation.txt | 275 ----- lib/adm-enc28j60.spin | 1042 ++++++++++++++++ lib/adm-plx.spin | Bin 17354 -> 17534 bytes lib/adm-socket.spin | 1221 +++++++++++++++++++ lib/bel-vga.spin | Bin 55312 -> 56700 bytes lib/fm-con.spin | 3 - lib/glob-con.spin | Bin 38104 -> 44782 bytes lib/glob-led-engine.spin | 100 ++ lib/gui-dlbox.spin | Bin 10270 -> 11262 bytes lib/gui-input.spin | Bin 7904 -> 7946 bytes lib/gui-pbar.spin | Bin 8846 -> 8914 bytes lib/gui-wbox.spin | Bin 8720 -> 9076 bytes lib/m-glob-con.spin | Bin 17748 -> 18460 bytes lib/reg-ios.spin | Bin 239806 -> 262274 bytes make.bat | 1 + make.log | 232 ++-- readme.txt | 4 + system/administra/admnet/admnet.spin | Bin 0 -> 175486 bytes system/regnatix/fm.spin | Bin 30648 -> 38302 bytes system/regnatix/ftp.spin | 540 ++++++++ system/regnatix/ipconfig.spin | 295 +++++ system/regnatix/irc.spin | Bin 0 -> 122998 bytes system/regnatix/man.spin | Bin 11816 -> 12148 bytes system/regnatix/perplex.spin | Bin 0 -> 28316 bytes system/regnatix/perplex.txt | 17 + system/regnatix/ramtest.spin | Bin 25658 -> 25576 bytes system/regnatix/regime.spin | Bin 87528 -> 88058 bytes system/sonstiges/ftp.man | 39 + system/sonstiges/sysconf.man | 36 +- 83 files changed, 4206 insertions(+), 1193 deletions(-) create mode 100644 bin/sdcard/system/admnet.adm create mode 100644 bin/sdcard/system/ftp.bin create mode 100644 bin/sdcard/system/ftp.man create mode 100644 bin/sdcard/system/ipconfig.bin create mode 100644 bin/sdcard/system/irc.bin create mode 100644 bin/sdcard/system/perplex.bin create mode 100644 doku/1-einfache-installation.txt create mode 100644 doku/2-installation-mit-forth.txt create mode 100644 doku/3-regime-im-überblick.txt create mode 100644 doku/4-forth-im-überblick.txt create mode 100644 doku/5-lan.txt create mode 100644 doku/6-irc-client.txt delete mode 100644 doku/FemtoBasic Manual.rtf delete mode 100644 doku/TriOS - Logo 1.jpg delete mode 100644 doku/TriOS-1.jpg delete mode 100644 doku/TriOS.ods delete mode 100644 doku/bellatrix-steuercodes.ods rename doku/{TriOS - Logo 2.jpg => trios-logo.jpg} (100%) rename logbuch.txt => doku/x-logbuch.txt (91%) rename lizenz.txt => doku/y-lizenz.txt (93%) delete mode 100644 installation.txt create mode 100644 lib/adm-enc28j60.spin create mode 100644 lib/adm-socket.spin create mode 100644 lib/glob-led-engine.spin create mode 100644 readme.txt create mode 100644 system/administra/admnet/admnet.spin create mode 100644 system/regnatix/ftp.spin create mode 100644 system/regnatix/ipconfig.spin create mode 100644 system/regnatix/irc.spin create mode 100644 system/regnatix/perplex.spin create mode 100644 system/regnatix/perplex.txt create mode 100644 system/sonstiges/ftp.man diff --git a/bin/flash/admflash.binary b/bin/flash/admflash.binary index 7103be7e2615542e41fc6ddb48e5765bb5fec581..c65a6e54a79914f511777a0cb871cf809d64bb78 100644 GIT binary patch delta 2121 zcmZvce{54#6vyv-d++tNeP``h2h~l6K@3b~Q0U_@vN$CflSBi=*nveERw!)94Czg@_3{53diYdfeW+UsJ=3sG-bvyG1^B4O{oSK-#%yOEdioY9}ElweJI0f&|;vjRJoo$?O z#3jTj<{Z<`Tw%Ign((+aF_0O>Ok~QL81n|Rn>oz1GQTmGnSb0un3fP;#&20-zh#OO zmL|?J?dcdD%xUI4)4^P3 zt}(*Hn=@XIDRTLn#{`)oj~Va}Y8-i2{sh}Md|E-oHDX%9reLH%U_*R`(it;WMS?)* zZJ=LK1-gi7QfWXJP-j0HK~3pm3m6xfe$PeT)cHkE0<*byxtj2g5+SaVpR*d;;hrd=ltGoCdTL%Yb&^ zbf6FLDWL5bk>+Wj_i=_yo+(XKnpv`Jwk#``Wfih)jx2jdR;-g1Zvt(@^+4}oEzrBT z0cdLsHv(cT3hbmD5L%*B_Xawy(_$}txD3tPrn3O=m+EJe>^`dUhzM;oEUjIe4cMmWt9 zx;94<6-HRolM8mtS1RTiVLcH`EQMSi9)D?|zz20-@VaY0My6t>$ z(Sw#xRxlU)2TP5|6+W^=jqlcT6cInHXS40pN9JuYN?n?%*j03uRiJv0W?y&pi||%1 z>1^l;$4iXYRkJ$YYOGZj$LBhN%4_khj$t`94;Ufutf<=|j8KMsMkvA4tom?uWmf!( zW4r2Vu6xUTgtw1haxPKq_)OPA)!G+7>l*jaGH!3leX3JJ&Xe%SofD!hB|1_haeNjYpZ)eJ_aJueQu!v2N zNhaU)M!8eBA5}Ap`^%8*FYIJ*XL%rko{rf1;<7+gs@mdS+a>#@MQTc;JbQJiZYa8% zh*!vcd&ZG-MS9N_O>U#G^X4)5Hd=DnoXp`XVU^jf{OF4nw)g|dcp}6}ei`=%f@SER zF&0fT%bsz-?qFwqs!xmGS)NEr6|O0hN){%}$(%qk%*BZmo{}AFI+JP6@(8c$WlBy( zPfuR+Eb>w0n~3Vtpza9P7PGK*hn*0p>JC(sGL2=Ll#_K0wS?gN)lg4JRHZg*i}|6o M8`}f?SEY#m0NFzdY5)KL delta 1190 zcmYMvT}&KR6bJA#!|d$r>>L(^S`Z7ErlwT+=(4jMs4b?^v|vR_D@*w*AKR8f+19cu zVC!-ax}Xn=(`ZZ8m^OXkrO85?*l5ydn@|%IANt^fNn_%R%7f9w7tnfcIo&P;^ z&;7V~=EtEFtlTk9AIO95$ZBFxzn@scn0ZLIpx);|#s}~~{3EuQ0MD5QG@BMA#d|Wp zF78UL&JVChyy!O|=HCwUk{84!@u}4Q5F4VvvS6oWzzd?q0%*4&1-%kR#W^WnkOdO~ z02cFNL0l2n0|tB{z7s!*b+O4dph7f?E-@}<#QS1VT(bc(;+FW@c3>cA!TF#8X|WIl zxGeJq$AH$j!Fh{ntW0x z6M2^W$TMUize54!X|j=-g2+?kAg2hC-=704%P z2l5a-gM5OXMLtfI$j7J(IZoBcgH(e&Ks%B9DU94lwa7;)g4|2;${vzuc2ga47ZGwN z)nkf}Py=!YbtA{92f3Ykkzb{w$cL#9`4IIZx6uIdK^jDErMMc7A-_V$)#4Ls7*fMY z)i$i!MpWA=)i$cy5~|}P)$uWM3td8fnJyzAphe`DLUaYWnLa^oqKC-)mt#hgmhu%i z#^0skD3$D9*%c@UXuPSJ9a?lgV+up_`86|E+qmG~Ci}0otw4Kyh3$goE(Ws0{-43%$3-`xItHvhA;J=@d)^<}@wwSy8t0Q6 VyN=||<*w=g%dMgArws!%_!oEm9bW(d diff --git a/bin/flash/belflash.binary b/bin/flash/belflash.binary index 074f9f15616ec37bb3eedcbe9b968dac74f826a5..1ddebbe64fda09841516bb70c58a76a911929fd0 100644 GIT binary patch delta 149 zcmX?MeZrcJVapMgeEW@T_XK54zWk41{P%xB{iFRq_&)rPV0iTZM+%UC`g8pYg~^OU zuNfCiek~pM{6B#4>i?XV|MxFoxKjT|0%Qb`?wI^gL>*`>r>HVx!)9I4*&F~(n@bn~ delta 149 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 diff --git a/bin/sdcard/system/admnet.adm b/bin/sdcard/system/admnet.adm new file mode 100644 index 0000000000000000000000000000000000000000..0dbb3b14229eaeb769e17e4b1dd64ffa42f746b2 GIT binary patch literal 21956 zcmeHvdw5jUx%b{PdrxNe%uWI%A%p>wVw#uC?BEUwiGfN7!>vdN?m#ICyWzrk_~4Htk7Un(~~*F1#qa zgfyEVOa;CLJPJH-lZ2nx?7|7)H26LsHAN66q)5UV_zl2j&^uD{g?B(71AYVi4zio= zlAr-)cDqmmzY%D$3&MASXMrCBdm!6~@PBX!!Y_cgfuq20fj>GVp%<_!l8^;V0PX

~PwJ*PN2D2iWHngu~$f0RJQK{{jCCAO@tk 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 U5ZnPlWW@>Js#m@`+voTEUrTyKi~s-t literal 0 HcmV?d00001 diff --git a/bin/sdcard/system/admsys.adm b/bin/sdcard/system/admsys.adm index 7103be7e2615542e41fc6ddb48e5765bb5fec581..c65a6e54a79914f511777a0cb871cf809d64bb78 100644 GIT binary patch delta 2121 zcmZvce{54#6vyv-d++tNeP``h2h~l6K@3b~Q0U_@vN$CflSBi=*nveERw!)94Czg@_3{53diYdfeW+UsJ=3sG-bvyG1^B4O{oSK-#%yOEdioY9}ElweJI0f&|;vjRJoo$?O z#3jTj<{Z<`Tw%Ign((+aF_0O>Ok~QL81n|Rn>oz1GQTmGnSb0un3fP;#&20-zh#OO zmL|?J?dcdD%xUI4)4^P3 zt}(*Hn=@XIDRTLn#{`)oj~Va}Y8-i2{sh}Md|E-oHDX%9reLH%U_*R`(it;WMS?)* zZJ=LK1-gi7QfWXJP-j0HK~3pm3m6xfe$PeT)cHkE0<*byxtj2g5+SaVpR*d;;hrd=ltGoCdTL%Yb&^ zbf6FLDWL5bk>+Wj_i=_yo+(XKnpv`Jwk#``Wfih)jx2jdR;-g1Zvt(@^+4}oEzrBT z0cdLsHv(cT3hbmD5L%*B_Xawy(_$}txD3tPrn3O=m+EJe>^`dUhzM;oEUjIe4cMmWt9 zx;94<6-HRolM8mtS1RTiVLcH`EQMSi9)D?|zz20-@VaY0My6t>$ z(Sw#xRxlU)2TP5|6+W^=jqlcT6cInHXS40pN9JuYN?n?%*j03uRiJv0W?y&pi||%1 z>1^l;$4iXYRkJ$YYOGZj$LBhN%4_khj$t`94;Ufutf<=|j8KMsMkvA4tom?uWmf!( zW4r2Vu6xUTgtw1haxPKq_)OPA)!G+7>l*jaGH!3leX3JJ&Xe%SofD!hB|1_haeNjYpZ)eJ_aJueQu!v2N zNhaU)M!8eBA5}Ap`^%8*FYIJ*XL%rko{rf1;<7+gs@mdS+a>#@MQTc;JbQJiZYa8% zh*!vcd&ZG-MS9N_O>U#G^X4)5Hd=DnoXp`XVU^jf{OF4nw)g|dcp}6}ei`=%f@SER zF&0fT%bsz-?qFwqs!xmGS)NEr6|O0hN){%}$(%qk%*BZmo{}AFI+JP6@(8c$WlBy( zPfuR+Eb>w0n~3Vtpza9P7PGK*hn*0p>JC(sGL2=Ll#_K0wS?gN)lg4JRHZg*i}|6o M8`}f?SEY#m0NFzdY5)KL delta 1190 zcmYMvT}&KR6bJA#!|d$r>>L(^S`Z7ErlwT+=(4jMs4b?^v|vR_D@*w*AKR8f+19cu zVC!-ax}Xn=(`ZZ8m^OXkrO85?*l5ydn@|%IANt^fNn_%R%7f9w7tnfcIo&P;^ z&;7V~=EtEFtlTk9AIO95$ZBFxzn@scn0ZLIpx);|#s}~~{3EuQ0MD5QG@BMA#d|Wp zF78UL&JVChyy!O|=HCwUk{84!@u}4Q5F4VvvS6oWzzd?q0%*4&1-%kR#W^WnkOdO~ z02cFNL0l2n0|tB{z7s!*b+O4dph7f?E-@}<#QS1VT(bc(;+FW@c3>cA!TF#8X|WIl zxGeJq$AH$j!Fh{ntW0x z6M2^W$TMUize54!X|j=-g2+?kAg2hC-=704%P z2l5a-gM5OXMLtfI$j7J(IZoBcgH(e&Ks%B9DU94lwa7;)g4|2;${vzuc2ga47ZGwN z)nkf}Py=!YbtA{92f3Ykkzb{w$cL#9`4IIZx6uIdK^jDErMMc7A-_V$)#4Ls7*fMY z)i$i!MpWA=)i$cy5~|}P)$uWM3td8fnJyzAphe`DLUaYWnLa^oqKC-)mt#hgmhu%i z#^0skD3$D9*%c@UXuPSJ9a?lgV+up_`86|E+qmG~Ci}0otw4Kyh3$goE(Ws0{-43%$3-`xItHvhA;J=@d)^<}@wwSy8t0Q6 VyN=||<*w=g%dMgArws!%_!oEm9bW(d diff --git a/bin/sdcard/system/admtest.bin b/bin/sdcard/system/admtest.bin index 995c373bd5222e674ccec82fc148ce36b7906021..00156269db3e20752b123582b8d770534d0a3448 100644 GIT binary patch delta 1882 zcmZXUU1%It6vywKotw%$K$yXvjpuBE7>EcSkO_H;+>g7GH3NL6Aegv1n; zJgr2@FxKPH1@Jal0PleJ;J>732)WX#l0RBI z$hfAF@3j~i4R?@F!W#Jj+yYUZkT}={_JQ-D0pf;AvIZgJpbGnfagDq&GWgQa$l>%s zx6qlWWd;d3fT%{Tkye zbI>>PEOVH$;RNNZm!3Pb$W--of=>j|%a+H|Tnyxu>4eqk#=9QtIWVxqzZRj}-p&LS zsfgG%3zU3b4dXf&h=ekB}`zZjC+9$1ce-mj%?^zG{SqBgy+jy|4hJCrUDSg!uC~C82_(T8mbp9u! zD^Tvov1fNSb0%27yeyN795V@f0o(d2!%X*1?9n487wr|LLRlMOLqc1dsbckJsHj*h z!pnqhDWC(BS5u9OQbyQjz9Op)ZB|S9!p(P&Qq%pidvCWX^vQJi^@PyuhEUe>rmbzG zd@oD7ZSg(3O{>{O3mUW7eI1fo-2Ic8{!N;$9pBM~-dPYQJHZ2$?ZMve#rWei?S2_k`ZjdMXc3{xaJcM<*t)LtB?-4#W~x@#)v4!Ibtu&+*`mX9xVIW9 zIw|~eM<`ev5xSF0SbQDL{c}r?S@??<`fM53XUn)g+mB25fBH!_rq`!=iSQ!JEX?c5 zd}*F<=uQz1p?WOiVUsduz>%|LJ2mOdIzsbiL`2gubiF56SUP-?OC7VSUVU!XP>d~< z&&sHiE0~+GO&yf6JvK_YQ)JnDdmHs5{)Aa9E7bfj<*7}J7brh>rfPfjJj!!nOe$08 zB42~TYek(DW*EcFCqztZ?aQyMM#6K1jque7VMkNA4xy|@62!k;zOL8jcn(+Sp9#Ip z`PVsvglc1AXKUw719(!F3!i an;oK1yj;{G)Uv(GidSdm=eHl;PX7gY=EmLt delta 1457 zcmY+DUuYav6voe;os*s2Y|W@~cav(G5dVvYZhDtnP2FTdq$P>&ZmLB@nvIiXHl}HI z*`QX*CJNRE3n}v=^r^lHB@kMnpp*(#5Fh&5fG8vn3Y{p3V39!lW+vO1haczr&OPVc z%bhz{hF1nnx^_!H`-@3t_wnAPXukKNIj?zLYacJRH}1twiO+>j{|F*o(~{ zfG@$1fLn}8 zP>3NH)9G8pAHW^xdoj0`Jk}@jNyW4R+ThjZ5RCj|^LHJ80Q056CeKW-q zvJ}c0#=4(-mkYs+DK3r#qRhn;f{$l}gP(b~a-t-4{|% zJ~ouQC~vCB-(GJKQTUUP={3&ix~mYUFGqCY-s|6&{Gahq5>i z2%B?It$}K`C;axoe&i4M>X@(Ef|0&5@2dxct|3(Tn?AJ9J-pAg`|b!235T2IkAwyP z%Ov-;q(bLjPxtjUd!~87zZy%Z5?jQtVB5f*V#|$pJTYoX)mGDLf)5Z6D`Rt^j_552 zRkJxEtHcjfu%9LC*{zyZMcHn@=1&{mot6!Zd#>Z8u-w}nM>{MPpLrwpW=0v#meMxM z!;W!K$fJD7?dd%HtYtS((Sn27yyqjnS3AG672Krde$?5M!r3{j^G|{WoeyJg_gd#u zqTv4Ax$IUBe%Cb#ur?jkDl-gwo&I~9;e6}T zXz-qFo=|#uOvvo6k`*D(FHbt&Qh9a4e`l>T+8iEUc@?kK=GRaeOen}{l{TVB%B$;% z*ayVpay>!(YIZ##mA0P9$cikHbhvm%Rvl${3nc6F9_QWJu6%#KBSNAG+1Zm&kTdn8!U#jX`4) zjJazfzDdJm9DIr@CSyL%wb68Fg*Weeza5G6UIHTu_)y^^@&AD2-Uk%jvpj;-X`~z; Y5pc3PYb1p2c(qk;iLI+E-H(d@06hRqrvLx| diff --git a/bin/sdcard/system/basics.mod b/bin/sdcard/system/basics.mod index aa7be0a..463403a 100644 --- a/bin/sdcard/system/basics.mod +++ b/bin/sdcard/system/basics.mod @@ -481,5 +481,9 @@ wvariable lcog \ nummer interaktiven cog : _ob onboot ; : onboot _ob start ; +saveforth + +reboot + diff --git a/bin/sdcard/system/beltest.bin b/bin/sdcard/system/beltest.bin index 510844dc939998506489df65a72dbf2d1a5c92b5..544d03965eb42f9be7f1c7ed63b66ac2fad174a6 100644 GIT binary patch delta 1882 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 diff --git a/bin/sdcard/system/flash.bin b/bin/sdcard/system/flash.bin index a5aa3402e5d797e721682dc4e469e474543c987c..c39692c9b1934863ea9c1bb00c4cbaacfba0ac41 100644 GIT binary patch delta 1680 zcmYjRU1(fI6rQEu>hw;qK0M($b&JuA(##p{PY#FdJ^xyKy(Y zyWP|TQg>T~rU+tPAH)|yd@KuMQL#Q$C{kZ7XaXW_^HRu-C=?%JO8w^EwEFPPIp3Lc z&YYP!GycKF!%24imU;Gck}dB1cK2ca{qC#D{n7rdOT0Mn<>;lJ)*0(%KF&>cgEMv; z@;AtPT(E;ilASUbn=k}>5Ap-x6X0{hWZyyF27UqVV*U@vhky}DvO!=n!k7nK0Ioz5 z>_^Bu5tD5(85;qP1LHu+WG(gsnTlL$GD$^Q z3e{=Cytchfqd|^ID!dpdWh%VFN!eUdFTZ?IQPh0bmQ$hkHOHq>sg9M6v$ni4*uH58 zG1nH`H+{;>f2?+xZPU={#-8Q*&h6O8+xI&n#@(6jhcpy>$L4Aa4RMDKbk13OpFhB8 zUkSD;8q&+AxhhebQ3kevouYK-hPC%ZTB^Q=(clzgG_1tRY!lL-<*MP3kab2@g}aoN z&D>hUsKaeD-q6{GH?!pe(s?2NDo=OX@sUPa z?|~XtBU@Eoy|lHDcEqM^l$~~-lomy`|K}0S)#C@0#(tg&MuT=hH-nLaQRp$)8BzK< z9k0u_d5(5z5_s=I#hsIhOL3$V_k+V4>fA|u-O?K`P3VoIhF~tJz=lPo!WorZ@dFpQ zhDzw0x*t@R3~f0t}WuA{g|e_AO=MIKhNuJ+5i+Ar${eqrlO zQ{HNyl{F@-RJgEU84I-qxnX%#7?kN#!N($Xbf2fY*!5c4SoD;5TT;?`4S>f{X z#XYXyE+f5E@o8fQRg_y`xFqDs;q~Ad$tjf*J=t=1IT4#@bW|=U7#+*uIFzxRuvu`p za@}gr%My+-*b{1*4~}yd0nN1wO>4VbbLaf}fTsS@_u`)RZ9hpFqn{HW{x6NXUm}cn`A#|O9b2a0To0L>V(;4Hcf1H zNk9v_+bX6CiZXro%`Zwo8$q93wGTeDO5Yk$kQSuS(Wg?OTI&DKq^1wQJ?DS!Ip?0) zbI(l0PdK!8!94M(L-Fv)=#(gpe(3DVzUo{NpFZ-%!P5iXzI8}cgh`(WqBYnbVJ``b zwiyl`GKgjjixy!|g15l?hDjg8u7U5tMV$Wv`#bmxHFn0KXEH=DffiWK*z_grw;7Y} zz>b+jyFdjzZBmzx!g&!K0}XH-ybj(5AApPC7I2toFF4E=g`f-nGw=hr41NQ5z}76z zvJcT^*jr$Dz@n)EqG|9f2*Ed?Xdz}fCcO#gJ@AobQs0XHu&UkK0g{u2ySKTbZv2}w z%f2}-q`HxWszM+6pviS1wV36)^iy|^ajs*>xtjEt<=S-OG`aSa;QgME{GeDl^%!T( zH$2%$v(E)FSEZ^qjT4@HXR_D#lA3d8di|Iy@}FGq;Qawrx}DFy+w1Q%Te6iNKz)wX z=-0us;_;}Rdsys_R&rz8b`$ULJ)s)BU0>}A<+DrdA(p5Y*o}V9jU92NDs+sF;6dU& z%DT3^1RF04)d|>=ZQ@)@gzUlu*Wx4vsi~9Z7L#1%q-L{H zZ*`6<`QDLaYXR5sSu;YGH$2%Aa^;j0#=Yk1QN7Llobd|Q+g!z)2zUyaNr$RzsG>En zzqz_@557h`A=ho<$@01_m9cJnvL$_zA=egUJ5*M@Omb;aulDc4bK@0X1oO&>uh`|7 zl^3YY&Gw>%Tug%Tf{@|7zAx1}DLUzF-%=Y-Uld;9I5roguQvMHxzMfn6og2u;D4B% zfsalQ&W6ZnQH1b9Y@?0N=#ROs-cu-rcK+A89D(9y04=ImQTkMHz1p(5Ls6RNeFz;x aDCB(tO19@MTLfX;S&e(_o*y1s$o~g@q%Hjb diff --git a/bin/sdcard/system/fm.bin b/bin/sdcard/system/fm.bin index d2d3405c020abf4d1724ee7aed4566e2d47a7a93..5b7db273252cef61bd896983a3c3e0e837cf4e64 100644 GIT binary patch literal 8280 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 X+D_8?N((zl+fvox(;hV83rzk8a%)R| diff --git a/bin/sdcard/system/fterm.bin b/bin/sdcard/system/fterm.bin index 96a03cf69286ad0a0d00ad3f6bce4aacf7dbc053..6ef13620d8a3c4ed2c9ada330841fe38dcacb7e5 100644 GIT binary patch delta 1564 zcmYL}O>7%g5Xa~3?l|l9rg5t%b%{VBB~o09kZeEm5`XYn0VM}Og7QtAZme~1lC|YT z2}-ex5D}_Wsq%qd%B81DRa8;L1qpEo2Tq(2$*oFqKy)qjfDnpOmH)2Y=J0!OX5P%a zd2i?K-e4;+N9{QdgW~tOvHwI3MPi;li0vD0AU;!KsvxY>D-Y zBWxI7q~vVZ`=;Y_UaIHI+G5HXYJZ@8b8?*cWGN-oERO~;Nuf%dBz^|AP&>!Tc0?aL zpOk8#uGIzi5uZ}#?otD@za&)M;fSmen-$@5QZ}-kx>kc*FJ23>o$6)F_7vh{a^G4d zKAJ`yrYXuBE$nkypE!|J*4(?%_fyJrJ4)LvzwDaBLQd$PwD0JTeVlY2))hgi4j<}z zpsNReaT15=4@ZrULpH*Z!_f@J@L1dp4@wSwPN2y4IpfP1l9)R@irk~^E#t>#aMsdv za8~Rbu7&%iU{Q(gii+?0p$lBQLf1F36V?>(PRQDebT~8DifJ+}YsxeSye&I(U}>?4 z((6;vnx_)`mX=AAbh)t5Y+1%a(J)@gcII6*=zG%NwyRziqx6)9$y55jrIaK0QQZA| zR>D#GKb4Fd_+{L{FXM)OsjxlfIA^sM+S>e@Jg~ef49f7i;A4{-y2T5+ z&h?ssvFIt&UsASdp*=^IH#i?%mVusd8h&eaC8ouW2)Pn?EpMR1qOS0e#`SqpNUzGp zM|;OwZ-l+*a8ViMDIv2xNmhhhzi7LDtBmwg#pbjHR8ek1!?!@5EV>V>r~U!EV;ZN@q#P1{N9>W7g0W zm!{JxSqUrP!n~}x!3C0Rcs}Ra(~&oiO3KBXs3CKe^C)8Hp@vZC z@ke?P4nyM5fE0N=jqdx!_G;+x$%v6EpN8pEm|Q+BpvhX*w1wmP^$j0y`Sw@l9q~Vc C0DBDp delta 1201 zcmYk4U1%It6vxk^m~TP1oOoPqx@CE#H-~zY|u7lf|NEmB8PM2ZJLz?afFAw1` zung9~@1X7?<~sBxY#00tf5Tm;myXOl_3)9-56ZM;hRl7VH?DFZm#!6@AattA$fbU$ zrn03F#9UV<6SG`5VeT$4*0b0m*ZMVPSsv*-G0WqM@Aj49f;#zLksaq<-^}INUq>m| zj64`yC;VulbKF|nJ4L)V^p(u^oYXk&d0y5G7974A*Y7Mk z?{}^^XIfe3;cHpvC>x1BpC|i>NF`s9(q`IEL2B;gxs`sdlybAPGn?W92P5q#`%{Xz zj&2Ss6AU~vuguBz-$~kzyU%6Q8(FZ9W1Mjpe;{Im%zlNMnUjik55(PGaTrfqHN7J7 zfuL73V)cr?nKvPsgyooNB%;$*GAqj|2c2u~Gu0qe(UMr{Z^a;G-;c!ptFde#m;1r= zm@>&yc3!Ttq)tnF6H@iJe_a&=kMdvI`B9&31tCQV5(B)$>|yw*1W_6YI};TMKfw?h zsEqo!*ZFOQtpW&y^2u6`xTUFEa{?(lC;@P M@!P)JQ`k`d0-;wP6951J diff --git a/bin/sdcard/system/ftp.bin b/bin/sdcard/system/ftp.bin new file mode 100644 index 0000000000000000000000000000000000000000..0752be3ac810a0d3a52c7ae61a50154bd7a3060f GIT binary patch literal 7448 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 : FTP-Server-Adresse (Host) + (default: mit ipconfig gesetzter Boot-Server) +/d : in entferntes Verzeichnis wechseln + (default: /hive/sdcard/system) +/f : Download +/u : Benutzername am FTP-Server + (default: anonymous) +/p : Paßwort am FTP-Server + (default: anonymous@hive) +/s : Datei auf SD-Card speichern + + +Ein Beispiel: +Zum Download von + + ftp://1.2.3.4/verzeichnis/unterverzeichnis/datei.txt + +verwendet man folgende Befehlszeile: + + ftp /h 1.2.3.4 /d /verzeichnis/unterverzeichnis /f datei.txt + +Dabei erfolgt die Anmeldung wegen der fehlenden Parameter +/u und /p als "anonymous" mit dem Pawort "anonymous@hivexxx" +(xxx: mit ipconfig gesetzte Hive-Id). Die Datei wird in +der RAM-Disk gespeichert (s. Kommando "xdir") und knnte +mittels "xsave" auf SD-Card gespeichert werden. + +Mit Nutzung aller Default-Werte gengt die Eingabe des +folgenden Befehls: + + ftp /s /f ipconfig.bin + +Damit wird die Datei "ipconfig.bin" vom FTP-Server mit der +IP-Adresse des mittels "ipconfig" konfigurierten Boot- +Servers aus dem Verzeichnis "/hive/sdcard/system" geladen +und im aktuellen Verzeichnis auf der SD-Card +abgespeichert. Von dort knnte sie direkt gestartet werden. + diff --git a/bin/sdcard/system/g0test.bin b/bin/sdcard/system/g0test.bin index efaadcff188f5013ebb2aec3f570c4bee287460d..0611247e736e68cceeae2767d310795edb4adecf 100644 GIT binary patch literal 6400 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 X22GSpT8ufaUupS4msc$!l^Fd8a(lB# delta 1235 zcmYk5U1%It6vxlKJ7;(HLuV+ZS*2*Gk*F`#ncV4(wAR^8tI|GHN)7mdnJ`%^`(A51qUC5fDeKomPM%rL4^txT8#K4G+>LiK2$pOL3}7G)c?$EjSs&)=YP(* zXU@*K^Tm#}du{ssoU#0@O>5S9dzIGh&+Hj_cSA+qjU~A(Jk=N!t%jrK$xA)|^jorF z^w!NM#UWwPmxAa#>`$=22$Ob6o2Dhv3}{J%UX><&0RLlf8hj1D13w~n8TMD?|A4&- zWP!*A<3JT`It<=}{~`Dkd<8BP3@RDaqn!qk2lj($@B)|x5m*9Ua18XpyI>7m1d@ri zgWcd6HmM8VhJOb904{;wK)FbCUlF_)aI4E*g-_s^NhByCRqteb0@E@XSLeS z&F0B;UkmJ4`vuuDOmK!yEjw&D(ar3BZN7_tQNp)AS-?(ZWa{WMri&`cZ zYhJ>8oKP43Y_BNDl`NPX6)IXxpO@>jC_ZUDu&wFlcLnzgZ%c*weT>(wb3H$xFhZe^ z_b_`9J~~0zLs3XY9m0vQgf=>(Kjyk}Tj40Q{hv;cBT(NAphW{K%5O-ztZkdC6Av!3 ehtP`%MeGSE)m}7fB8-yGAnCJP?m9#U3Hlcdlq$;r diff --git a/bin/sdcard/system/ipconfig.bin b/bin/sdcard/system/ipconfig.bin new file mode 100644 index 0000000000000000000000000000000000000000..bbf44a043db104f3e906b981c5f8b22c59df08d1 GIT binary patch literal 4996 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 k%#Tj2sq%WHP9PQVdI6JF1`(fF5G58F8 z3A$hvd=J*ZqY!JcpCJ4UHozZX7yJj#nv6N%7Wf3*1M8+>Ti_qa$B41>;1ak3J_L6u z&VD14iSP)!9TsdSoMes22>UT2m=B&4f}IwOodXxZRdJZHZy*dsVT_t=3FB?>Ipo!7 z#|ocsxuUUXJENUP;c?<+x5_Us|HDI%F-cQYPE)4V1((&cy#clf4Wr4bxtaT~3pm$Z{aA@{uvK~7kOFHCo9+v%>2*OKd1vR-eZ5|4A zYowpG-t0BFtYe~HGUv>YqQY$2mZhKq%2#C7)d$FA-Sa8e`OA7cohxvsjCr1QRZZ~k9+UR2;x2(6`*R@lp8Jif*r~7A#2ae8_PXC9{c^F%78&gKb+BL4~oB9rc*Fo cgUO{+9Ga|_MVvdXU+emK($TtYGR`#r1B!T$qyPW_ delta 1182 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 U#KXM!E(*oWi-E{nN>rTx0qpO+GXMYp diff --git a/bin/sdcard/system/perplex.bin b/bin/sdcard/system/perplex.bin new file mode 100644 index 0000000000000000000000000000000000000000..0c835f5b1e907bb692b9208d2ae823f950602720 GIT binary patch literal 6164 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 Py{G@}2Or$CkU0Mf#R+6@ literal 0 HcmV?d00001 diff --git a/bin/sdcard/system/ramtest.bin b/bin/sdcard/system/ramtest.bin index 7d2445277842f6e2a425615f09ccef05e8d2401b..67b51e03f1ef32aa9b5910ba7f702ee493b47a45 100644 GIT binary patch delta 1882 zcmYk7ZEO@p7{_P!cD8%Fi#^NPUIBSaiG%|**PC-d?xk8x2#q1efF?9@bzAr9wcMRo zY-7n?0XYqcBHK^;!5E{MV44^Rs4*I1Klt)ZqiH`Fw2eZ-Uc|&0tX2HaUZH;Y?acF^ zXP$Xx=9#+-8$RvmA{VCB!*e0Bt7ZMlZnAmhq;AnTQOVtukh6+Kt_Ca;Wg+sSrjsw5 z2&sb>osb@I5=_3{^?QYD)<&vXtHCN-oA^w#!f3vi&HILC-Q(+WOsLYcHgVG*BDaTX z$5#7-vMi*00q%{-wPRUd(3XW0zMw-me~D_;q_yLxq*OcpwmYkI(NEmffjIra-52Pk z^X^pO8T|`?_{1-6ySkQU+{@}Z_7tt1_}4wCu5C@*e;d^A-x?U?(K zmZopIH?=su%p%iFC0ALP^r2F|)*|GIrZ9Q0NhjZc8z6*g zSp_;k61=LDHd2>jP$f?W3F!l6^e2Pv#b7d*?jn3=^Q{Gz6xSCGHIY?2DHqp$DMjT_ z77VZq<B;FrDzG?a9=aqXw*Gx?!fnFvu*dYLLIm)ny-lm#EurxB_3^QW^KX#7`0i{ zzMY7MZ2oTtq%Ce;W6>C@6&4I7a#Yxv1zFrcz_EZ>Qq#@gk4w`xt8n5fUO4%i)M zR$Q#e{bUcx{a`VF$X_Z3MMN4SA~f&$E^uvh8orS^KaEhMLC~d{HcJdvO@(*zqR{o` z!i*JPG!#=4fl^PfSP+o~Ly311?y&T5rD~|dDOK%G)Q21q_6ppawep1ozPun5GzAg( zGaIw{0+RdZh7qwv;E!C~k$!PU`o$gJFXrFzAWIt6!+ePFJWC%PHU^R+eLXH&oXz`HmiI6>atk|_u4~wVyVY-l-DN0j#nK(crMIAWf)luRAAvM5GR3> zMeXu_5z(9C15>kBaE!2>eAXiDp#+XYD6>|K_=n3EjOrNA;t2gcA(t`#I7cv{Tt8Yi z+MFS0)GLnb$eZxe6iW`vU6m*tM(b=>*}RwM(ypPo~PkdwnQ>T2IM!i}iq z(fSDGWek*aYQGu~EPJRk#&doKEIq`FjyyoZ%LR`m-Iwp$*O|;xJCA#ru@WBJ5tElz z#NE!|I;H4gAtx`l-ms;UYc_9gO?NiV5^oiS%k9S7cK0+-SCUy`^1o`&SG a?GzR-=J9`NJ6>tZtFmaY9K&BHCI0~n-N}jo delta 1529 zcmZ{kUu;uV9LIm>_MY3Wy>oXsx}qeq1p{;rX17yLJN~3(kPv1v0|`Ee*l}CC(QT}D z4rC=a*jHywH}Sg++a=%c2GAgXTW^sCh16vL4c@nGs#nOnT@uX&<-ff)SuU z{6uk2Fk7(Pbe6fGVXm*~4_$#C3sY^bpw)#w zS3tR1%G7JFVAO?oTp_R~I0qV)sV|^j`jQ!JW9npaB9qT&3Y(5(UN0saiB+aQc5*7y zSJZb}id|Q_uZP`J3EwgHK+X70Z28^Yerpwr$cPbUOPm*GvePhIcQyyMFk#z<*{j<0 z_7~2q|DUMx2nj?b?SF#h6q7#ZMr0!@u*#X|odax%rcpKNXkM&(U*E&_s9*K5K!@AI z*?x6^_pyvR$9J(w^#ec3-c_57(I-n@1>98FyUWUlYS!4xzEZc09`=h0`;W1kmx}&Q zR$B4zWzR94X2566qMz`Rzp((VVAV7t6NJHLuw4t#F0A{&0C+{S=uL19_RnAm{0Z)B zI(7MoUINF#7$}3Y;2by)X23-smFN=~m%%sSN5FNW9pE4s0@IkGS#SmRGFSycj;25y z3~=o677AkIc7P+GXb_zSZ-ZHIAH0ZhJnh%%D%S784cIGw^>xGUp=63gvgy$SF6G_T zpdL@_-Au^4u9RTTRvKh^FB6V4$a_WFGlx0$9qlAfxHSfOa=&Y2dGa9RT``gI0zS8^ zJfU6=USQkQU%`znQ6|$oN_=}d#sr6VltJ3Jc0h@#8gW?MTN=3boB3^sJW0mpa4GWZ53 zUzN>C)!2BsRp%pc0>*mT%Zovg5pPFYx2tXlLOsKajkvMW@|Jq0bK}EYhRTQB z>$Q0=KCGXKc+C<+OjIT*S1o7f5A%eOpdyJ=XnB6 zEU$S;g>OCfopcD1x_}Z1Jcu_L&eMeJPsX<9c_*afkaE0}!4u1^`1l|j1WO6V}QoyT0Lf#H4 zw90=s}qz=>jwtSr&Ug%U#a(lD*K;awV!Ih`cAwKvs6>_qp^zkDXI zc#RX=v7~ofq%rnjqBXWHQX6qkC{L$XQq!s}{OYP|Ih3fDu3D-|Oi$A>94MfwHP(dt zRBI-54Ro;o9o4F(te7$%WdWtvfa>p1nfv+)Jk_-I@z8LvZ|UBCVr6*4)c~(y*KDqZ zO1ToM;4D;OKhi&koH$CTty*0hq3Q^)s=i`z5<6?X*?; zQ-&FXo;PU4GS&_|qgoyIQ6k1*d0RFVx*vhm?k8mkNla0#rI@3cp5+c<$?G+Z@(2R( zOZk7ygju6O_V@KMEoz*3N_ZfTpb!#}Fz^cZO$!bTc0yjZ!gGnrb z#{)4tQ0%Rs2Cdu0GSaK72WPLi4_}7$%_Mb9)oP`K`!^#7vx_<~DuI(QbyRDk(HQNC zB_dALj-@IqDwXlbAw|_f2&yr%Lejwsef0z$?SvO*T)UYFIf`vX5e6o8|8#FZvN<$-Lm+H* z;gxH6*KmM|01W?n?-l6afuq^{y7l^$nypv+jYx)j zM6YvJ(7}i0h{>jbJuZwa$(|Q1_krKrA5<-2__|c($>G0AUXlFAl4oq1A#!;`^>DyX z2M177wMssw{Tqx?6ME2H6lzpg7zm)j-5aW;4eoQHm1}QBRnO07VHj=^AEYrN51M070gJBMKI%-h)lI^HWOlN=fvz_DINUYFNHQP zs&*lyUqLc?y4`o5oTOSe8Ig@-6X9V^6se9$zM#+FBPvg|gEiEW+1P!(@B)L0-WphL zG?S%cQYj+wQs}-^us997NB<(HiuTo_T1l>nKxDv=iq1r3{kMH>;+@kPxS#EB)^meI>)r8-)d25LA z?V+1>YKnlbi4H6|xOWhB5U8#{WS--BpJryxSItP)QuJzff4D}MtpaW5EY^2l56?(@ z#h%I)J8C^CLKv-eND~6<;5dwKeW(NT3~^M{Mv~D~q&xONA{i4~T^{JW7gL#kB%Vqyw5cY%AXr~*}at|$^+K{>wW zMPAGG8X6kQ3S~awMXFU6m`Zt`EQ80M5VNra8)H>O2OoQCoWA>PuyAj`j~9M!4RwjV zb{7|4M{C@T#q-h)gijDYr+Ah1e=dA@>9_@`3=az*zGJ+e5R8=Z06royAkPrgwpb7+ zO1EmI>lBspThN2D?*=tKmNDAmtns#S+LEj`I!5btaaFuv%E~5>5G;-ee7OiJF##=- zqpJvQdcJC9WN5hoT?~k?-qXXhaGZnMtb>A_HakD34~^5eRHiJ)x*90*dh1B3QA7E1 zs}YH$NhCthD~3f32pq+u#3Zua2;L<+yTS`Bu#eXZv125IeAYetS7GNak%EXIXF2Xnlmf+d$qri~?+Q?|*VEYD2X@l0Qmnhp$4#xu-u zW}&vIVe6Iabd6CGH{&^*}!aH|A|=oeBZ z2G+9L8pU#7o%pTv3#?X$ChC!PkL>iwUXL90$Z?OH_Q*MpyylU&J(BUr6-o9e9x3%m zg-34nNS#NP&-3U;kEA@Z$0M#sp7h8wg0O}&pOqh^=_b6_T_Y!(L3s;nB5VyVwS3bE z7Zu!Up=)JL2JTKd(I-TnCuLk*aXnmDrTEM$C>17LH^s|vU1d$UrM92y19hySZr`@7 zH^$OAPwI%zd~YILOwH=dBsvweake(D`KgWBti`|G5PJWpp4be5LQi?n^O1cKUHDli zf(l8Gf-4le6x_&=S=S(C$)^TjEBZpdBvIs($)_fte({uB#yp22O_-*zdgMkFvC8VjLTGbK#g_mz zes%^m(V9$?-9gzB${M})c9l8qrm6jRihJ~>Y%QT^c=_e%7D2<8GajR5nGD{>=H=3s zhdnZOW(+?!*lKtBv`PLZe25~$P43cZtM3-OCtR)fJYbH@27V;2&#tyUx0*1O%Vuq{ zn#dGZ6J&Iz&9=B7PP>sN-J;04#*RSWR$O#Vhb6zWE8yFe+=YJLi4(x#N`@sfyd=|w zm+llNM!Zw#Qk`7O^m1Jb;ADwBcnZ0ADl#SQ_~Wz_);JW}soCkURQ6Xn>j?I(lm~;& zQrPiT_+uu^nF(qR_P>fFr44RO9&GoCgGmV33b+yf;Iv~T#>=(*>b6rCbw3I*ZeG+0 zOIR0mllv~}_zlUnOl|K&mG|+CnX#szBT8+D`!a9oR))2@56vhK;axjNHOFVv zVQb!-5xEWj`}Cd1A3t5@{=V~e2LB?xj9q%gdD+1h2r`bLQ1mjrPiA*#vzxFaL0*9b5qXG{%xov}Fc?4qF#!dYS2oOUX4l=kNKQPl zc7u2c2PNp}S!h{WzUs5_zqJkYk`nf`ps|{t0{xd>&LtC?t^uA%*k< zPXH%EDk&*d$!x#|HkB!4WP(Ea!h{?Nhv<_vXQ&lRb&+&uUq>%76Fo0qc&W%fD*gQS z>#1%u1TUVK4T}=lP-R2biSBCJM|>qzHZC>c9@(gdZZRF`KP?*(%E~D7Q09~RG^jp; zO5fX0;K{JxWZ}jCHn|d*$fZCHXMq~?r~TylLxh^L(V!0Y6a5>XUx)5>=w#zMl`;un zs&w%eVhp=fzLHw@BDr!)yLpJj7kE3MzBWG&-G@;k`$##))ASfxmho#9MRzTC3QN9J zQ7Es%XkJJDfu1mHJp8i!Fr`cEmCA8?we9mxn-`%2yUWG&+*xWEi!g6aHaryBAsbB7 zqh@)xo*vlqnEhw(1iRgvpihG9rO)CyT@BPl#Vj?rzuxZl)npt_64MM(XAyO?>j6#J zM5rYmn6DKbQ}Db3bG*tpx3^yfGkVi?D(J>5TN)~y6XZ%EUWE*snEz`oUpLGPw17=_^^L{qY{(N6m( zHEu{)btC=;f|k}aa#S`ZBT4)7kQsxpNZ^6#l)76O?gLjYknDDB3Z*f9Hw(b8(e%%~b zg!dGp$u<$psysnW4FA1}?mys!iRD?*2Y<`*GalIggzKzvbn;qLtgWxTs-cQB*@smv zwUQ3p`-(8q*>tc^3)XPhV}j)#@Pqw+*${^BIjSP3`2&ZS9R4$hXKcDA=02-##OI|0 zd$1-EsTke91EbXkw%aX%CV8dEnZ@>FfdzE2{Z3$Y%L1fwq?mgRux@Id9iF<<5ons>fk+D zDMbh`#rxu$MtPBwz7O6adRuaYU1C*A2Ohk2oWAF%KRDR$;lZzr;cl_t_QA4A)Ucl~ zTbNl)_ypl|Dm8@5|8rpbt8oKRCp-*nV_h!|h&V4e_aWUygHz%O4~YR$@Oxw<(;&%| z&qw{p&kbr6gG;n!dE*`9wBfuqdWqI8wX&FChml`A6h9wKk&XEX7N7&l8^`-Ew3&!( z{>hewgnwV$~f;Ub<@d7B~c@(CSB;% zs;V-is*0cvd?I2%;K&mxM!8}Rn*)1}Gaa&TRQ{7AFC3LmGkvs@je4L14|O>c!V8FE z@etN6GG=ulKaN&)1ql+G%0M=8yoa5`PT0Q&O?-)|kN8rS+u-KfL$9MDxx^9;1%C)w z3&PKtUXwyNpL7dp%c>-*`ggA09$}g^St=M#x`))4<0-4)_xImSrRok`+>i z8`~1#dSD%}8MnAzU_bar(f$nR5bzps9C#1-7mx!k03qD;rUCN+184%)0-J$2&|9pK z-JpZO&wyuuSAaL|zfTNiz9iknt zVHpansN_JLCEa4%#*%t8Uw1{jFt~$R?n%KC%N-`p5;stGn?_lYo-nOkHcj;u3}3Wz z%t~E>w4$2MmnJ=?xFkA0UNq4JUEI^D>G5o|?(P0R+P|w5?~Ga?&NIU2@JPUpVAG z=8~{WX1HX&OX?T8bhS&ix}?t~_qya^mpm>ATYUJINe5|W73Ou*=%J-i-o{oDwg#6@ zzGak)3U0N~ZD*@ATyP4aM~J-0k#Vt<30qq$dGuN+B_>?2vdVFtWUFwCOb%s1Q^s(Q zXGh)}W0`^{dDLgI+Yv6N<#l=*MG9Jr-DoLZYN9vW>b+AFdheK?m<%C9Pr2Xqk)Mbv z{Hzs01ssop3kq&cEw11^H zwK#1z!*tu22&rwHX>^>_I?i%CYtFmh$eNcv&@gRJHdl>cYVDh*PRcavJlNyup)7>4 zxN^3y7c|$0gVMo1g6le_lkt*hFRX1=h88Zyg-S{H!9N%y8p)70m z?$k{EystRE0;f7_xaOKi-ysR^Q)Zjig^VwRoBmgPVU9Ie@r`X$B(>EtMn1;}17FCR zxi7iFdz;1;YnXe^#;>!K$yBdbKH*aQ7!RJ~3weDRZ{#b=f~>(C!xtE9HVca>V|_1` zi-gQCo)gP~48zl44I;5TtO3s==P5Z)<~$YW=@n0BcbMx?EC=i*wg@XFa#UuE#6YNG z%S56>jjukxA}Wurv*na6rL57dUgw#m8T_)vuNr)Uc!cebrtN4)R`ANR(N;l2XLBy2 zC-z~LeRBHR z4PuYQ04=Uxcyd+=o?7xTv=m|xrcN+1xF4@JETpw2z9}bkN9}O|fooqJBH_`YMCGs!G+IeV8LCA#H=j#%yj z&k}v;(K~!kudl*NTRU^zyOa`&A1^&ati1yxd3*4q!Q45_;=TT<*d5UYiV?r!un7sL z9CS%(vLpM#uG8L~!+limMMG~wib=DIIE%K{;%9}3rYGx%Tq{;8U05kGmYtqCbqZEW z(-TghERoi`EwP?N@9oO5cKf-R&9&|Lp^@UA-21ALW7{+nUq0PkI>atVnL|KUN-U8p z3nP0DPSk|mUR_m=|2NrV_<_@{@5>%DbNKah0-I|;UR_b1sCD-Q2RYsZ-NfqR;J4qY zek;?CxGi{UM;5iM0gs^|gz`d>5Go;P7T(Ej42=K~_=g1vT_J}?Wzijq$}t68SkCJ! v%A|M^%g0_&IxEH2LxrM=S71HPw)J{Nd4ay>&iQI&c%LJlvS)k^;h1ssn# diff --git a/bin/sdcard/system/rom.bin b/bin/sdcard/system/rom.bin index 07183b56ceac54d15fc93fde863294738cce87b6..2d664a3e8b8a96ff1ee814da0a0ba25ad88cba7b 100644 GIT binary patch delta 1541 zcmYk6U1%d!6vxk<%t>b^(T29P@uN#=S!|Y7WRe?ind~wkiwe)30_d&sh1)oG8TUZcUgyK$NA5<_@*Z)kqyFUEpp8vV$ zo_p@syg$Bm@&tW-OJ8*ov^DVI;23>8I7yn8Afib!=u`896OXqV=B!Xcr_aE*g6KPu zpxbDF69$E6_7zY>t`@in`)6<)9DqMHozfAaH^3sOgDc=Fcn^F8 zJ^|Mv)S~M!z6XDU37sep&Vw?zq8oG#+duj+ zXN!7TNOdQ4&4{3@2ufTKG7yVgkj0+4%;*n%7kMVkvB>#zp;6-edBL_VmwEwPj?Xhv zohfOnw!GT@!FGnr&u9IntU8_F#pQ`f;)$Xy)Dn-|LUKx|BBzL-hA&jFbE@;McJe|> zs{XoG7u-jDN*Vjj23o%cxS69x<0};c&{iUq}?S{a;4{t?nIg3e`V?Dz_p} zj-Y(*#RbKnL+8gZedpK6TQNi%dpwRL#iA-wpEGNoN_H(RlP2kMex=p6 z^p%3HzmPqwx@ySxq`w=lcv*a3|J=2bj*9$I&bUEb#tq^!ZWw2W z2fxfYtGz0#BrBZ1v}tLZ)lGS1c@;R6?sMM9BsE+LFSt*x*9x2kPZ@qw#SIG=Z)|Ow zXUsJj=%mx|+Z*dKE%vC8>p|4oHZGFs3J+;qpQnZNDqMIlcdUIOymAf~aGG;MW{)jd z7V@3Tao2B`kY1|TvbKUMN-Zdy1@dHZk8z>pl1dtVnbP)d+}t2mayL#qmBn@_Z8vUH zxVf@xwKrrDTNthhwQPjj*~Eax;iZN(;#S>tzqVi zP!x7o3gUy*GA}*|g$kme`=Wy2ixeMxY{iEJ`cgxo==juHM8x=?nT>h)anAqTbI(2Z zo_llSrS)s*&O>YJUXhCZulm>0n|_-Nqew(HNwVb6YgRR9b6<#0g+)JstAgmdDAFU? zKZK;0unQn>5Pb;NfgwXu6?Qu~h+3z>E%^7rBk%{A=Xn-@I4bFp$ zCN=37I5)uGpwA*21pB~AOHvzLhW{J*6FdX|g8?Sm%2?x%=oxHZkECJnO%DzOA!vig zU|SBcoJCh)uYr5;XLG;Pu_HSU?miOj7pkdukovrD;WfMZ`I}zL^{lc``gt0vh-AqF z0at}e#0XcFm$~DN^(1zRD`|}p)_YPXV7*W9XO0@p5^nl2SCrl!7*meA(0btb17lyh zaYIe|(Oc2pu!(qs=LkK@>m8xk7TRN*cne~wI?8tRtFiH!4{ABzn1PKO zLf3unQ8i*YCPKE=jQgT))R5NQZzRZ6;bT{KGab^8t!IFjud@Z8*zI zdc%UnE748#uX!$NTX&nuMZE8mi=eEp<C VRhy6n;fHa(6XWyTzMi-8?*Q=g5z_zw diff --git a/bin/sdcard/system/sfxtool.bin b/bin/sdcard/system/sfxtool.bin index 7dde763a28afccbb47d9ee4869c4d302e466a8ee..55aca0e095a806193ddd382a16dfaaeb4686808e 100644 GIT binary patch delta 1697 zcmY+EUu+ab9LHz&_IK><9o)8*_5wnX1Ve%k&0XhiXoG?&$n`E-6@z~g;mG!~SFY{e z<=R|L;SOGSFh+4n#0T_+H%XCbh>1_eny61a85*MrttL&_`X>@KO%cDdTM9mWc7Ffn zH^2GK%>I+Pn6ubtbNa-9#V&43?GTaP9T%*@=qIVW?B}i5Uwdz3>!vx(U9PhqIAco~ zSGmO=(-_+g_G&sipc%}DJPw-R9C#Oe2(E$~@XulV4&yHv{{%e3SQ2cHSZn~ChWr+| z1g=C9>^8<L6c;Ex@5x5S%0AGVe@CQf{V@JUma0y%i zbKoa3*eci@Wo$n<21Y;)TmTE-+lIlSF@x;|g&1Qm zgX5qHz6Ef8JzLT}w3U??c8rkK#RzuiYZtctJvaZdv>6y`XToV~l zlZKIWZzcLxO)Vakk$N#!b7gA9)cP_^I8+#KwM~8eDP14TE{{2~%Xfu8pQyT7e1$7D z46cm)RZ81p1;yR_-Avgsa<|gwsJK2y#q~KsTspX4qm(z>6Jm^sDiu!8nA*(Pj94|@ zDhyKhso-Og8m^nGuC3#?l(Fba!=IE1!^HjGIWYSl-=;#)6KXR-^4{zMNQ4( zipCu7B8}tI5iZ;+71!5}w+q2#wyB7#fEBW9lBjTT{_LRRx64Q`WPDT`M-}B3G@K^# zWbs_^Zp4U885{b_v-64AG^4{}KEdeOEZQNp`9zup%@r$Vds>vx!eCFRWjbi*BqlVL zPdCgSXUu8(wHX6-Gf|(V{J7dxog<*ROh+2=?V_TlyjXx`HEsmcEBY8}a;T_p3v{z9 z%-U!!Pjbh_ZO5ey--yR`a(S&FaB{Y4+Ix^duQXR9YMC_WQ9{U(SWz|ISk z42>uaa+*#bY6cC#KL9*129AN#;4-+1`1i0s!`_Ge6TATbf<(-ujbJoJ^c6S(&c~AU zJM14Zo$@-hs81&v0Q*4|jDat~QP2V>!5MG`Tn9J6J@6RlOw+y--Cvq5wg+%$Ch8&)KUx)M6|B>XL@ z?X7Y@$*rk3|8Pk?|8JRYyLz{f>UsOf5n;#$6&?^W6vI3q-N>ym;^EmLcG^9Lxg0qa zE`K8UBTGnLAx=$~Sl7R{xJ~cF?$QPP@l6++>5Yes4xDf+)!;@jO}OJ&!pE6+ES&OT2pWWh01t3IRP6?3f1)3 zkPYHxqoT^ToUmUswFc4_dTa0Zw%fu#p57;H|6#g_Z#t86wkf@GOQq&jK@~HqUzIZ{ zUYi)PFt_b34id+t@9S8o)th;?amh|hc{uaIr??D9dEqb!=)4YdcEgMFy0Cs>tf8eW zQHMVcCf-H&L{Wb(vq3n1tZUjo-}O@~ytaEVyf$X?l<_3Wvceydk0Q!^8njc88aYvJ zzMZSg$ShTc%dT;0`P5*0nH~?|SL_zjUhw3okf){#)nKYJvo~Dw@|re=tygC7R6O2= z%ytJyj;OrR(Nme3O(u>K_siKN@lJa-DU~*xwB)FCNmjXhST?H42qsBRj0aru{p`?+ zk}JHr(t<}xJK#S5Wj5c5=Hp8z+1#dVx!Y<#NxVe-P3c81*WZ`B(<-^-RZ&{PrH6OJ zMK1u-~a#s diff --git a/bin/sdcard/system/splay.bin b/bin/sdcard/system/splay.bin index 9497795032a1530201b07add00229ec7d71b51ab..8755b8577b02ec0196f8796e7eb028f9030c516f 100644 GIT binary patch delta 1785 zcmYk6U5Fc16vxk<%*jqB+1&_B8(Tm6xkwSAN$z;J)z-G!cJm?Dhl(iLY-i(SO?D?S zTXyZXNh?wn(T51O50zp;sMM(V@#0H`3WC@d6}yOtyALXzfPz$9SL%NzY3svp?m6e4 zbMCo!?zzh=Pp*#B#~1afdYn%7UmSRoz8v^4J||XXrDJs_wJBlAo$YWmo0KK8d@1wM zJK|x{IAiV;b)nNwg2=;28WC#-J)y4f%WUGq?i&2BDBaw}gmR zf{h>rM!ip4!jRO0iS`- z!8hPX@C#VaM0xNGcn-9{du-5GU;%P0Of(GA-~n&|JRgqHrSM*z{s<3IxzC_)`x5k& zF+?9227L#Xz^Vw*25=A915Sd!zy?#NF_WkajzT_Twubfl8@U}Mw+voe;*7eoZ0c4) zPYJ261g5O;rwX9Rc_DpejPtV46(<<;zU^7g206w!_fQ}dIX5bJM^Z>06eo^7$zlCy zQjT}M&)XhnrP^N9rjqjIEzJwbAm;o_%?lo90A%~CY{O7p@dy@YGvFLxf= zyKrsY#=F<13rS(|X5u6SrSWEbLxDbSn_*(B^#VKV@9oWx2lJ6<8792YaAB#;Rq9Hy%_{4c4@p;280UG8U)n7`PNEUee2d@H{A8} zYr}-b!+sPborh6Z>x;hQQN$Sw-6Lr2Ha>0m+bbOKw}-`oxnQXzEGp5RQSn7DaDi)A z==vrWf->UW0a<&IHt(8fMm3p|Rb?21?&Vl|+0>$86{_VTRaYgJOf8)v>2Pkc(KPkR zZMy!T)u}jY$aAGPA1k{SzS31123Liy7LvAHLUI58ZYFFM`m>aFe805g`=y=0uY2z% zIAb=aWQAmzb4TV(ZLTsWmrb_}gVH_Dd03>1tLyqL;J6Lnn0J-oO{W5OT)%I@HE>k2u0b8pq>NA>A_PZ>$|{W`oACIj{6$PDraK$&!#K zj_q~4W)bP7icV;gsG`__hM$By7J30aD92U8=t~#d^RWo-%pN(9JGj@vaVTv*mZact zai5yAvVbED_JmqygX5e=K)rLMZmx7H&Wu-`Gf+3lTAMSI{;p~Q4l^Adtw(S7+t1-g zbFeH&jUc?FS5T9~d3|-Dn?v2K^_kAJkabMdOZvDTQd~HY!ZRLJz`2U7I{pEYth;_A zUy3|3kSPeejQ?^uW_i53b+?)5$3Fc(+OzC4?^=;dbq@{?ObQ)jcORtI>*mEqra(6S zE}k)CaV!TJkx=42CFCm!C`kuxP(|i4XHmq$bq%4=<2Q6a9EQYA15#vzCh=Pq%c~VP kn@4Oa^H!LihRNZr0-CIrjhL_k(j|^kg9AIO8)Mra+e>e9QyJRMBo&Ja17-f)tFP&6?A9i> zI7OCBkZpnpd&~)pf586_)>w?_ z7BB>Mfqg)Naqtj03T9$idIfw3`J_H|w zFTwZVXOLl{5;y{$1Fx|~m%!Js0}ziB4S=2CUhr5Pd+`ApNQ_uiN?7z1IF%qe3(kW} zU;{jE!DpHDE!LmF3T!j!kD7;C)iIKznVaieR@XQB%z|U)g;du=S4HS82h?~%NG+y# zLOPLIXY6a=vs?*lOmVdw8a1xoFZhrxBxl5#(-RywPuX%hie7dDu1IxH&6v04Isb2S z+y1h=(bpaiQ3dIIol54+D@WxhRywMdG{R57nbw^iRfj zJyVn_(=?ib)5J`9$f-qUx(Zl00fF%Ue^%YVELR?GUnLKB3IoS1NN&9Z;q1YD`tO zXZWtWl24M(7BO{8+5%l9ENtWc5DDrY4|YMpL6iSKb-cF~u^ zg>G6ZqnpP6f^f>H3n+mDW+5faoha{*Fia diff --git a/bin/sdcard/system/sysconf.bin b/bin/sdcard/system/sysconf.bin index fa3d56cf44106f5a2ebc1d4df5698a330caa791b..6b491538c67fcecebb31ab0e66d51ae091bcf62d 100644 GIT binary patch delta 1781 zcmY+EUu+ab9LImNx3k^bUD}g2cm~lzAOi8Fd!5U01PF*mpzU2uBT#Ma2hDrdI189g z_ZiVYXdR8{8O@}3wG>@I|1)qId=0LHZ^12$|AzJf=m0%Iv>ptCoe7g9+P&a)@CG;z zra%BLfzQF!M2hYtQcbdSqBPhBhQMB3r+Ktj!1v%5_z|pt-@zZ?FYpjBPSg)JftSE( z@Co=5Tn9gaHaE#OOxj`)jertpfB<}9j1zrlIMmyt(@+o5?w$d<(PPpJW}3b-2dHD3 z^kUMagTPB-7ho2A3YNis3pVUv0qqTN2mO0iYsTEu%wDDUqw@Z$rDuzJh6#B; zGL11cR0JhnU_yygyda8kcY*etrlgD_DdBErUR1UDb9b1U+Ep{#M@Eq~okJX9)siIPAo=17E z^^3LbbWX^=x>jer7ZatqGTlHMPBU5e_&QM|-dDzoInl_r>sk$N-IcVbV`sa9_-4_u z=7l<%R*B??Boa^bEd3ol@(tbKb^8bD3wLGp!$-8%?#p z;z_kXtQL($C+e!5r{fWsS_vZ;xW=8>H@zI?k%}8c?auW0YZHO3iHxX8)9kC>b%s|h z%{FABK9a0eWx8W&!x<7j&rdZ2OP@l89n7{TeK``_C%S93+KoEFeo8>Q%HM4n?e>!;Z~FBzLN0UB!A@gBqkXPnJ?l^Uvte!C zMBXIoi+prS?W)e;Fx%$GM;i7fRc^QpSXON_>X!9Mq~!C0zA@6)KpeF(+n#2kfq_O@ zKcgokFP_Y}q8w$w^OK_Hs{-do6w7MWMU4c&FJAwT4*>#O0G@8V*WF~mZC zMQuIS%Bl5h@AeJ(?mglcgEuU^_?Oh$)OWi%S|krwj~|)2a%u#9M1n|lMM8-*gzKY7 zYKV;Z$ZPqr!c^$gnpV?cNIx+k#25-EE@)Lk8=jOF+g{;&V8WjSm9~dLiCV>UnCFM} O#Sq1vY`CNoqyGSn7r{*c delta 1366 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 G!TJ}R-6P@v diff --git a/bin/sdcard/system/time.bin b/bin/sdcard/system/time.bin index 5116c7247048792865dde220f177cfee26b1bc0b..c76f515643e6eec73cc3d388386cfe140b7959a8 100644 GIT binary patch delta 1925 zcmYjRU2GIp6h3!$?(Xc&wq2mW1~4@E6Re;x+q>L_ML+?AE$y~Zlo*t4rkmNaExXIM zwn=dpqCrJs$ns$1kryGg(fG%UNmU*(AwHP)!NgEa5T>y)#D`jn-^{e7n|yoE_nmXk zJ@?+Z=Zmd3w?*me8|um5qSO|1)?J~Qbr+)>f}@R5c5C&Q=BDs=%XpQ&%T)TC5zS$Y zDnzRljZP?0IuH92?CThR1a1Pq)-HrMvgX>=@cPPVfaoXS58$7GMx+u2fkrh-CQycb z7Wf#rtVU=8R_%b17vw86E5lIog(9#y&Qg5JHb1=9Nj#9z%#NueTeY`CKEiu&Yj8gp!$v} zdi>~7%i$eD?#U`AP4U6b>bU968GXMx?(lZ;pI&`oxgeWnjo^pX@n$tAa=ruX8bWIy z8CNSZZZg@-1#!=MX35&JWNlrto?Wt@Td*uKZ^>N`X7n(V+qhsBPnyfM?aQ^bew?|e zCFZS)4EbVwnJ72-K!aemAlNp{Oz89LuUgN3SvAQQ)Q$jYBloI1%;=83bHBiRr z3@}-;xF(9k^&FN-iE?7Pq!bahFkf-A?Ow>1@JQ|Fx>s1Lwy8dOEG6~cBjKZ_)a+@g zOl4oRwe?IS`9Y~>e~=A#w=&f~a;m54c=Dyu(x2PaW#M zUcX^2HpKlnw>&shz6Ax|Vsn?-TB;g}@@_j4__8`omHaV@qN z=Rb^I-mX_qiaru~o<2RID4h|Um3~x_t$^V|ktc!PfF>b&WK0XSWXC2W;bG#fVlqO!ErH{Z z%4EbO?{LMeUL6)09HF--)H3WH=Kv;@r%#vlwRWF9u^#@qYdU6mLDhNk)9 zvhkSPA8g*0hB9Yp-t?T>hnj5Osjm09-sop74^0m+QHG>-UD3fpcHZ5(&)uNf+bcG&Nyq)O zL{mhs5|-aYYu~K6QEAVRg$qaP)uy`JU?USqbb$n15(6>O3hoq<8TnDy?L~&E;L#=S zPKOYCBp^ixUW@;H-B!8g(JNw2dAtF3Hsn<#OWsZBy;p(4}GW)f~_F9ffRO?;^W*JzxUqsPvDbt&i9<( z?{|Lpp1a(CeZN6Bm$VB<4Z7Yr+5IJ*=>F8$6EfNjG1&2)`9x&+PGnNd3XOgjMC-5* zVMRcvlL3P+28e3#zk;oUAHi*~0@m#JB73WYL82qzG?)eNf-B%#umb)F>g2%w3rI8Q zF>qERIuG6ii&~79V1LmxN-)t77y(DY8BhS{Km}X`Z-I}&=ipbSDmCDAhlqy3@sLgx za2fvhU>U4|zd$HV)DuQ7+(B!w4e+F{)0mFKz$s7xx548PXc3J*g#8SB4gXGLgJZcKbF|l~*6o<68OC-ZR@?-?q1Z z+k1A~d#>qOa??`jM;k2>q54@0i35vY zrM$rYv-N~X+o||4{%7M|Q}>UYE&I=OK@+bVB!&`t*u5v=xui#bYs<6 z=QO%+MVHI*JzZ#@{W`Z9BsA{B@pdErj{Q;MhpO9o{;bCWmjXQH*7H;Wce;5L}+RMV4XAr~)=m7H3!e%zhW=yc#bhPGJ8 zq+5IhmEI0nSx`wmJXox+#v*SJAC{{z;ulk^F{uKpF;kXho@9x0uggkF>COVl`B`^# zKWUqcXY#_DQ32<-SjypX`=7RCD>k3qQQF)0b>;@ltq%#4E-nAVvtMpss%G+Jm9R8} zOHWO}$4Uf7GYGmt5`l@yTCZT|8P1}KyIT>KA~v>TcR7UQj({z)cpv^axF1^Q&U+F) gGdu$645Si|2t=|nqsN3*a^~tzjng-7c3cVm56y*Vy#N3J diff --git a/bin/sdcard/system/vga.bel b/bin/sdcard/system/vga.bel index 074f9f15616ec37bb3eedcbe9b968dac74f826a5..1ddebbe64fda09841516bb70c58a76a911929fd0 100644 GIT binary patch delta 149 zcmX?MeZrcJVapMgeEW@T_XK54zWk41{P%xB{iFRq_&)rPV0iTZM+%UC`g8pYg~^OU zuNfCiek~pM{6B#4>i?XV|MxFoxKjT|0%Qb`?wI^gL>*`>r>HVx!)9I4*&F~(n@bn~ delta 149 zcmX?MeZrcJVapMge7B8k_XK4PzWk41{P%xB{iFRq_&)rPV0iTZM+%UC`g8pYsmY8& zuNgN?ekqIN68ygD0v+JU6mCT#Qa8Y_rZ`zpQjy%+j4-{=#WscSgS3ft# zd3(t^&Rg7ME1a==kfy;{(h%&VkzsAn>~ahZ8DYxJ57_FfqV~q1U>^-!Pnp$@E!O8 z{0M#qcfft{0OX0WGvF+^0KNd4qf1vM(Gqw*L1t-89_#j?Pv)gf#B@#nyF(KF= zi7ac1A@;ox>@LV81$!>Z*eEy*UI$&U!Gg~+SqpLzd<=cb3T)cnE*)fYbnxLS71Z4| z%XG?Sj!ShnauvBADuW7*ajA{dG$zY^b&@cyeQ!`P%5j=XFGfm*N=G;yvbm%TKY#8N z#m%>DInj^4?1og7>iLQ>W6KNMI@j%J&gFMI*F!4Ef341;|2u+#_-0-RcE>0A-XMq{ z<4$lpzI~%&lq=g@O^}W6MY6d|Di}^2*drN9J#vX`t#OjNjyzXo$}`%Jp~xDie6X0< zc_uH_V8du|N;4W&Vr8}o8P0Oma49A0j5bucM|s(FdJUtFu=V+d&NjN9%~>}XZIi3k zJfo*`w!29PUg>tQjwSM&^U9h$k$lxw!s{txrSgI&ws4s@-w9q5!+Y}Xqq^cK)uktP zOxx<=@07=$HXzxjV#jvuhWc^3HVhcFOV5I4(k|2$tcb-F=80R;$=HFLyw=v+E1%Na z!(!1`v=okMRAu`kDzg$sAqed&{n+fSsEkZsAnW=}mkv*MQijaQx)Ng0znLCcvy4<+ z#TvzA-B;OF%NWTq=}~FA-LcH+1EzV{=}mcRDD-8xoUZu}zS36)gs)%W*uDp;KvImKj+N@o`=V_|ARu33H!4rPW^3b9BXkIvVR z*Yn%jIp!-7&Z@Mq@XEK%b*Y$~liJR@&9F1yN*SpEE?YWku8W77^tg{SUPwo|^lLQs zcD>&<#ta5q&T+s_V6{MFcHEB$vib@+6E(v)YG!42(PN=L%j8wYI z=_KCF%W@fS@Q8!sP{wlFX3^o|J$2?~8AllH3AM~e$2p4$&EDCj^^`Z|wZi&>K;29> zx>T6fyJ~O*w0d;3nc9kfC~n|*37)l-h^AM~Db(cAn7Jjgt)YI_W~(>LWfKFkvu?z+k%eJ<=!`lt zBR}f8^~l0h*qO(+o(@O$i32H$QQzn;#`0>@lYZj6YqSrplW=*okHeDnnn-ik3me@K M9i432%w(MX2e*~DQ2+n{ delta 1341 zcmYk5Uuau(6vxl+=APuHN!lo`#QJYj#zsINZu-0ZWt)?ATmH~W2jYfLntB^>N$7BIKKL|PVKP`j9K8h}l$9#X@9!qFK78^!-}5`a z^EB2Ne&GWXL>qjrU0T-ourD`nL^74W1 zsvVwLUh1v}T#$bcbtnJtP`kGi(GR+-S+j<=>+6=GzCoyeC|Vbe|5fyakp5P5&#npL zT*Ve@j&1y2VOzL7;lC6+oE;|~*E^rFtu4Xhx;7l^Uv_jK5(k%iC1OdiAJhJtbt`Z21jqEUVl{bwyFC%R4%vwR-qFE4(R% zWGmM5d+-|W$LZRzVemeE3YN+HP?!I}y6C?j|GuN2RC!B32^YA^y4OF3Pm@=f{*Fqo z2Vn?8`$j)D6UM4^f7v;y`%>pZqB|9~+2yh_tJ6X{154I~ymUc%LATm_O}9T$H_l=n zsyz&m%f}HJW+=)zm9b*u)!te%j&F8UuAv9VoVBD>##$2pd|4ssap{a~dddnGNwyn$ z7M7AHa)pX;=amuMPC5Zk+OCTH*=$J2M(7OA2(%H^6UF{{J_y&FaCv-CK*{F3l@zWQw0Z%?DBiZoBticI#1lmG diff --git a/bin/sdcard/system/yplay.bin b/bin/sdcard/system/yplay.bin index df270860f7932b3c9f4f0d31fe3ba296946d8bb4..369b5de89ad4c025d495aa1b4fdd72e1147608d7 100644 GIT binary patch delta 1744 zcmYL}O^j1j6vxkfeW!E#+8L@Du|iNZf#3uey!O^Rpb$V1`Vl`!G{#A!_-J0o&P-c7 zlbJBsLNur`My(5ti4tLh!5Rayaf1noD;FjvGP*D@8xmfl3%@cB!T)_7VDWqR{Lel2 z+;hL)M{CZnOVasE_S6Y9L+>QJ^j`A)q_$2DeVrQ;X@KF;D@of@6^+eFm<;{yjo1T81Gp?>)9n2hbh?$H52S6gUIE0^fjd z!FS+$umBc84?N672fzfF10REPEa^vZ4ffqpqRn6{*bB;_9Zk?r(S0`k6CI|;fTUjr zQsl{Dx*#R}3MeLNeT--XWIz#o3T}WA$0pw)YJk^apLROi`SDg^C#kKgZZ2_7Utf0Y zY{^awrLTvsyf9rQQ0AggMjYazD)r5AM!)gB!uc@AAuj9*jWQSZ3*PAp#dnDl$Hq8n zzvimL{phn^zLfRSl~lI6*wB<>GV`Z7?l#!{fNB6AxB|&ssIJy@pjs*vfdz zWE)+{mR%9V52z()j`;qx>#dejl)G)rG!m?Sl;c+wL*>BGo3NH zW<-0p>WZRNkMHP+(fZ~!)>zOWlAV+fJ&4tCKhD&K4vROMQLt>@h`Kt9@^~EM!~FacjFHy<>|v8H7(trOD0U0*-b<$P>L8J+T)L3?gCZpDX$nl(`~U0m0g zFKS5R2fSaXT9u2p=Z?4Y;l=j2sO@q=sO*ZRDngw&w$BgRWu#X+K5k8-igF7IhlD&? z+-kfbby%n5K&ISXNW^ewo>U9CgZr}B4s9(YTnaZA_o+RnO4!11O{irq+|FqXX!eda zoqPQWe>SMkOVmxO(dFEvSye+IV7ABmoAGt#A^H4l0iNZ!42M_j3Do3s(Ow&BXSkoW zIoq2Ss)>$f#Xf9DG?xyh@f!{+;KGEe`(^`4HEZTc2F}yzTuFFUoXh1zHsHOkIkY;? z_A-vsI0H=NSIyG<+5~l`;+s|%(*3=}KO>Dt<@NtDoiF2;TDcN=IB@(8cDG1lc%cvtW@}sV+w-km#CvR&r9FEi-2U6t2cVk{Lrq`?QyeF}#%G=<22`-87?ngBbqNo%K&BW<;67#i7 z@=za|tthPsEizOJKB*7B)RoZq;9I~7f)?Mjt4}sBflfdrAXcINXJ%`B_;Jqv+;h&{ zyXWl2{M@@FET+LRqrZd~qchFn#D4|FE~9|)ea4vK2fuxg?dT(yRU3cj#Ti*k@nKP#MIJUv=2xq?f! z(4X)a9O9A-@hODIW6>QdLc3fcK8kp(Ugt{iVfyeJ6{YvLjke${vDR{HbpH11o!<)M6r?6jl3R##bv`kB zmC?B8xH{N*F&?MK4Q)23gmU_xnicBO#j+oEn%!5TF%Qleim z$aJ~c?PW9g%_db3GdSV&vPv7hEdJffCFOH{LA87>!&Oo%%UF-#a`vTC)fL{nHo`ku zC*m9UUwfVltSnK(@{ABg}ne;)Z$@9s}pVO(B2Tm=sb@j cbOs@x#|4yX&C9It{IJ~(u|}B{n@ke)FA}gjJOBUy diff --git a/doku/1-einfache-installation.txt b/doku/1-einfache-installation.txt new file mode 100644 index 0000000..47efa7d --- /dev/null +++ b/doku/1-einfache-installation.txt @@ -0,0 +1,23 @@ +Einfache Installation: + +Eine einfache Installation ist sowohl mit dem Propeller Tool von Parallax, als auch mit Brat's Spin Tool (BST) mglich. Die aktuelle Version von TriOS ist auf der Webseite zum Hive-Projekt zu finden. + +Downloadlink TriOS: http://hive-project.de/downloads + +Downloadlink Propeller Tool: http://www.parallax.com/downloads/propeller-tool-software +Downloadlink BST: http://www.fnarfbargle.com/bst.html + +Nach dem entpacken der TriOS-Archivdatei findet man alle ntigen Dateien fr eine Grundinstallation im Unterverzeichnis "bin". Die Installation erfolgt in zwei Schritten: + +1. Vorbereitung des TriOS-Datentrgers (SD-Card) +2. Flashen der drei Propellerchips im Hive + +1. TriOS-Disk: Die SD-Card muss im Format FAT16 oder FAT32 formatiert werden. Alle Dateien aus dem Unterverzeichnis "bin\sdcard" werden auf die Karte kopiert - fertig! + +2. Flashen: Im Unterverzeichnis "bin\flash" befinden sich die Binary-Dateien fr die drei Chips. Bei korrekt installiertem Propellertool oder BST wird bei einem Doppelklick auf diese Dateien das entsprechende Tool zum flashen gestarten. Nicht vergessen, den DIP-Switch auf dem Hiveboard auf den entsprechenden Chip einzustellen! + +Bei eingelegter SD-Card und nach dem Flashen der drei Chipcodes startet TriOS automatisch die Kommandozeile "Regime" und ist betriebsbereit. + +Im Tutorial "010 - Lizenz zum Lten! - Lang lebe die Knigin" kannst du dir die Grundinstallation auch als Video anschauen: http://hive-project.de/content/3651 + +Viel Spa! :) \ No newline at end of file diff --git a/doku/2-installation-mit-forth.txt b/doku/2-installation-mit-forth.txt new file mode 100644 index 0000000..5db072b --- /dev/null +++ b/doku/2-installation-mit-forth.txt @@ -0,0 +1,66 @@ +Installation des Grundsystems: +============================== + +TriOS kann in zwei Versionen installiert werden: Mit oder ohne Forth als integrierte Programmiersprache. Als Standard wird das System ohne Forth installiert. Die Installation ist so fr den Einsteiger einfacher. Mchte man auch PropForth installieren, mu nur eine Konfiguration gendert werden und ein Basiswortschatz im Forth selbst kompiliert werden - keine Panik, klingt komplizierter als es ist! ;) + +WICHTIG: Das System kann nur mit Brat's Spin Tool - kurz BST - compiliert werden. In den Einstellungen des Compilers (Tools/Compiler Preferences/Search Paths) muss das lib-Verzeichnis eingetragen werden. + +Downloadlink BST: http://www.fnarfbargle.com/bst.html + + + +Installation ohne Forth (Standard): +----------------------------------- + +1. Mikrocontroller flashen: + +\flash\administra\admflash.spin --> Administra +\flash\bellatrix\belflash.spin --> Bellatrix +\flash\regnatix\regflash.spin --> Regnatix + + +Installation mit Forth: +----------------------- + +1. Umstellung auf Forth + +In der Datei \flash\regnatix\regflash.spin kann ber zwei Compilervariablen eingestellt werden, ob TriOS whrend dem Bootvorgang die Kommandozeile Regime oder PropForth startet. Dafr ist am Anfang der Datei folgende Sequenz zu suchen: + +#define forth ' forth + spin-loader +'#define regime ' spin-loader OHNE FORTH, reg.sys wird sofort automatisch gestartet + +Einfach "#define forth" aktivieren und die Datei speichern. + + +2. Mikrocontroller flashen: + +Nacheinander die drei BIOS-Dateien in den Flash des entsprechenden Chips flashen. + +\flash\administra\admflash.spin --> Administra +\flash\bellatrix\belflash.spin --> Bellatrix +\flash\regnatix\regflash.spin --> Regnatix + + +3. Der Schalter bleibt ab jetzt auf Regnatix stehen. Ein Terminalprogramm (ich verwende Tera Term) starten und 57600 Baud auf die Schnittstelle vom Hive (DIP steht auf Regnatix!) einstellen. Nach einem Reset meldet sich das Propforth im Terminalprogramm auf dem Hostcomputer. Datei "forth\basics.mod" in einem Editor ffnen, alles markieren, kopieren und im Terminal einfgen. Der Quelltext wird jetzt im Forth compiliert. Sind alle Erweiterungen compiliert, wird automatisch das Forth in den Flash geschrieben. + +Nach einem automatischen Reset sollte sich das Forth jetzt komplett mit seinem Prompt sowohl auf dem angeschlossenen VGA-Monitor, als auch im Terminal melden. Im Prinzip bentigen wir nun das Terminalprogramm nicht mehr und knnen direkt am Hive arbeiten. Spter, wenn man in Forth programmiert, ist die vorhandene Terminalschnittstelle aber manchmal sehr ntzlich. + + + +Erstellen der SDCard: +--------------------- + +Im Prinzip kann jede normale FAT16/32 Karte verwendet werden. Lange Dateinamen werden nicht verwendet, Unterverzeichnisse sind kein Problem. Es ist sinnvoll, alle Dateien aus dem Verzeichnis "bin\sd-card\" auf die SD-Karte zu kopieren. + +Das Verzeichnis "system" hat eine besondere Bedeutung: Hier sollten sich die Tools, Erweiterungen und Bibliotheken befinden. Im PropForth: Mit dem Kommando "sys name.f" kann aus jedem anderen Verzeichnis ohne Wechsel eine Datei name.f im Verzeichnis System geladen und compiliert werden. + + + +Systemstart: +------------ + +Beim Systemstart wird immer das Forth aus dem EEPROM gestartet. So kann, wie mit den klassischen Homecomputern, sofort unkompliziert programmiert werden. Neben dem Forth gibt es im TriOS noch ein in Spin programmiertes Betriebssystem, welches sich dem Benutzer durch den Kommandointerpreter Regime prsentiert. Aus dem Forth kann diese mit dem Kommando "regime" gestartet werden. Im Gegenzug kann im laufenden Regime mit dem Kommando "forth" wieder zur integrierten Programmiersprache gewechselt werden. + +Wurde TriOS ohne Forth installiert, wird der Loader aus dem EEPROM gestartet und sofort die Kommandozeile "Regime" aus der Datei reg.sys gestartet. + + diff --git a/doku/3-regime-im-überblick.txt b/doku/3-regime-im-überblick.txt new file mode 100644 index 0000000..6b5d8e6 --- /dev/null +++ b/doku/3-regime-im-überblick.txt @@ -0,0 +1,100 @@ +Regime im berblick +=================== + +Da wir ja drei verschiedene Teilsystem in unserem Computer haben, muss Regime wissen, fr welchen Chip eine ausfhrbare Datei bestimmt ist. Den Typ ausfhrbarer Dateien kann Regime automatisch anhand der Dateinamenserweiterung unterscheiden: + +*.bin Regnatix-Code +*.bel Bellatrix-Code +*.adm Administra-Code + +Dabei gengt es, den Namen ohne Erweiterung einzugeben. Dennoch kann es vorkommen, das man eine normale Spin-Datei mit einer beliebigen Erweiterung gespeichert hat. Diese Datei kann man dann mit den Kommandos rload, aload oder bload ganz gezielt in einen Chip laden. + + - bin/adm/bel-datei wird gestartet +mount - SD-aufwerk mounten +unmount - SD-Laufwerk freigeben +dir wh - Verzeichnis anzeigen +type - Anzeige einer Textdatei +aload - Administra-Code laden +bload - Bellatrix-Code laden +rload - Regnatix-Code laden +del - Datei lschen +cls - Bildschirm lschen +free - Anzeige des freien Speichers auf SD-Card +attrib ashr - Dateiattribute ndern +cd - Verzeichnis wechseln +mkdir - Verzeichnis erstellen +rename - datei/verzeichnis umbenennen +format - SD-Laufwerk formatieren +reboot - Hive neu starten +sysinfo - Systeminformationen +color <0..7> - Farbe whlen +cogs - Belegung der COG's anzeigen +dmlist - Anzeige der Verzeichnis-Marker +dm - Marker-Verzeichnis wechseln +dmset - Marker setzen +dmclr - Marker lschen +forth - Forth starten + +Marker: +r - Marker fr Root-Verzeichnis +s - Marker fr System-Verzeichnis +u - Marker fr User-Verzeichnis +a/b/c - Benutzerdefinierte Verzeichnismarker + +Die r, s, u-Marker werden vom System automatisch gesetzt und intern verwendet. + +RAMDISK: + +xload - Datei von SD-Laufwerk in RAM laden +xsave - Datei aus RAM auf SD-Laufwerk speichern +xdir - Verzeichnis im RAM anzeigen +xrename - Datei im RAM umbenennen +xdel - Datei im RAM lschen +xtype - Textdatei im RAM anzeigen + + + +EXTERNE KOMMANDOS: +------------------ + +Die meisten Kommandozeilentools zeigen mit dem Parameter /? eine Liste der Optionen an. + +beltest - Testprogramm fr Bellatrix-Funktionen +charmap - Ausgabe des aktuellen nutzbaren Zeichensatzes +eram - Debugtool fr eRAM/Ramdisk +flash - Flash-Tool fr EEProms > 32 KByte +fm - [F]ile [M]anager +fterm - minimalstes Terminal fr PropForth-Experimente +ftp - FTP-Downloadprogramm +g0test - Testprogramm der Grafikmodus 0 Funktionen (TV) +hplay - HSS-Player +ipconfig - Setup fr Netzwerkparameter (IP/GW usw.) +irc - IRC-Client +keycode - Tastaturcodes anzeigen +m - Startcode fr mental unter TriOS (sofern installiert) +man - Anzeige von Manual-Pages +perplex - PlexBus-Tool +ramtest - eRAM Testprogramm +rom - startet ein Image aus dem EEPROM > 32 KByte +sfxtool - HSS-Soundeffekte erstellen +splay - SID-Player +sysconf - Systemeinstellungen +tapecut - Tool um eine Containerdatei (Tape) fr mental zu erzeugen +time - Zeit/Datum anzeigen bzw. im RTC setzen +wplay - WAV-Player +yplay - Yamaha-Soundchip-Player + +Bellatrix-Codes: + +vga - VGA 1024 x 768 Pixel, 64 x 24 Zeichen +htext - VGA 1024 x 768 Pixel, 128 x 48 Zeichen +tv - TV-Textmodus 40 x 13 Zeichen + +Administra-Codes: + +admay - Yamaha-Soundchip-Emulation +admnet - LAN + HSS-Light-Sound +admsid - SID-Chip-Emulation +admsys - HSS/WAV-Sound (Defaultcode) + + diff --git a/doku/4-forth-im-überblick.txt b/doku/4-forth-im-überblick.txt new file mode 100644 index 0000000..e8eab08 --- /dev/null +++ b/doku/4-forth-im-überblick.txt @@ -0,0 +1,135 @@ +Forth im berblick: +=================== + +Einige ntzliche Kommandos befinden sich in dem Modul tools.mod. In den meisten Fllen ist es sinnvoll dieses Modul mit der Befehlssequenz "sys tools.mod saveforth" fest im Forth einzubinden. + + + +Wichtige Tastencodes: +--------------------- + +[ESC]-1 Screen 1, COG 1 +[ESC]-2 Screen 2, COG 2 +[ESC]-3 Screen 3, COG 3 +[ESC]-b Break, Reset der aktuellen COG +[ESC]-r Reset, Neustart Regnatix + + + +Wichtige Kommandos: +------------------- + +load - Datei laden und comilieren, Ausgabe Screen 3 +dload - wie load, aber Ausgabe aktueller Screen +sys - Datei aus sys-Verzeichnis laden und compilieren +ls - Dateiliste +lsl - Dateiliste- Long-Format +cd - in Verzeichniss wechseln +mount - SD-Card einbinden +unmount - SD-Card freigeben +words - Anzeige Wterbuch +mod? - (tools.mod) Anzeige compilierter Erweiterungen +lib? - (tools.mod) Anzeige compilierter Bibliotheken +cog? - (tools.mod) Anzeige COG-Liste +cat - (tools.mod) Ausgabe einer Textdatei +less - (tools.mod) Zeilenweise Textausgabe +dm? - (tools.mod) Anzeige der Systemverzeichnisse +regime - CLI starten +aload - Adminsitra-Code laden +bload - Bellatrix-Code laden +spin - Spin-Programm starten + + + +Wichtige Dateien: +----------------- + +Die Dateien *.mod und *.lib enthalten ganz normale Forth-Quelltexte. Damit hat man schnell eine bersicht ber die grobe Funktion dieser Quellen: Lib's sind halt reine Sammlungen von Worten zu einer bestimmten Funktionsgruppe und MOD's sind mehr oder weniger fertige und abgeschlossene Programme. Ein Beispiel: + +Die Datei hss.lib enthlt Worte um die HSS-Funktionen von Administra anzusprechen. Mit diesen Funktionen kann man nun ein Modul (Programm) wie einen HSS-Soundplayer schreiben. + +Im Gegensatz dazu die Datei splay.mod: Mit diesem Modul wird ein HSS-Soundplayer ins System eingefgt, welcher Funktionen aus der hss.lib verwendet. + +Die Datei bentigt man aber mehr oder weniger nur zur Entwicklung, ein fertiges Modul wie splay.mod enthlt dann schon die die entsprechenden HSS-Worte die bentigt werden. + +Die ifnot: ... Anweisung sorgt dabei dafr, dass keine Funktionen doppelt in das Wrterbuch compiliert werden. Das ist quasi ein verteiltes und fein granuliertes Konzept analog zu einer DLL. Die Forth-Version funktioniert dabei aber im Gegensatz zu DLL's nicht auf Bibliotheks-, sondern auf Funktionsebene. + +*.mod Module, Forth-Erweiterungen fr das System +*.lib Bibliotheken, grundlegende Wortsammlungen +*.adm Administra-Code (z.Bsp. admsid.adm fr SIDCog-Code) +*.bel Bellatrix-Code +*.bin Spin-Code, im Normalfall zur Ausfhrung in Regnatix + +basics.f - (mod:basics) Hive-Core fr PropForth +ari.lib - (lib:ari) Zustzliche arithmetische Funktionen +cog.lib - (lib:cog) Zustzliche COG-Funktionen +adm.lib - (lib:adm) Administra-Chipmanagment-Funktionen +hss.lib - (lib:hss) Bibliothek fr Hydra-Sound-System +sfx.lib - (lib:sfx) Soundeffekt-Bibliothek +wav.lib - (lib:wav) Wave-Soundbibliothek + +bel.lib - (lib:bel) Bellatrix-Chipmanagment-Funktionen +key.lib - (lib:key) Tastatur-Bibliothek +scr.lib - (lib:scr) Screen-Bibliothek +sd0.lib - (lib:sd0) SD-Card-Bibliothek + +debug.f - Ntzliche Worte zur Fehlersuche und Entwicklung +rom.f - EEPROM-Dateisystem +tools.f - Ntzliche Tools (cat, less, dm?...) +hplay.f - HSS-Player +wplay.f - WAV-Player +splay.f - SID-Player + +Administra-Codedateien im SYS-Verzeichnis: + +admled.adm Testprogramm - HBeat-LED blinken lassen +admsid.adm SidCog-Version (wird von splay bentigt) +admsys.adm Standardcode fr ADM mit SD/HSS/WAV +admym.adm Yamaha-Soundchip-Version +aterm96.adm Mini-OS fr Administra (Testzwecke) + + + +Reset-Fehlercodes: +------------------ + +0011FFFF - stack overflow +0012FFFF - return stack overflow +0021FFFF - stack underflow +0022FFFF - return stack underflow +8100FFFF - no free cogs +8200FFFF - no free main memory +8400FFFF - fl no free main memory +8500FFFF - no free cog memory +8800FFFF - eeprom write error +9000FFFF - eeprom read error + + + +.err-Fehlercodes: +----------------- + +0 no error +1 fsys unmounted +2 fsys corrupted +3 fsys unsupported +4 not found +5 file not found +6 dir not found +7 file read only +8 end of file +9 end of directory +10 end of root +11 dir is full +12 dir is not empty +13 checksum error +14 reboot error +15 bpb corrupt +16 fsi corrupt +17 dir already exist +18 file already exist +19 out of disk free space +20 disk io error +21 command not found +22 timeout +23 parameter error diff --git a/doku/5-lan.txt b/doku/5-lan.txt new file mode 100644 index 0000000..bfb2066 --- /dev/null +++ b/doku/5-lan.txt @@ -0,0 +1,192 @@ +#################### +# TriOS R56 Netzwerk +#################### + +Einleitung +========== + +Dies ist eine Implementierung von Netzwerk-Funktionen in die aktuelle Version +von TriOS (R56). Als erste Anwendungen sind enthalten: + - Ein FTP-Client, welcher Dateien von einem FTP-Server downloaden und in der + RAM-Disk im eRAM oder auf SD-Card abspeichern kann. + - Ein vollstndiger IRC-Client +Zuknftige Erweiterungen, wie die Integration in Regime und direktes Starten +von Programmen aus dem Netzwerk sind geplant. + + +Implementierung +=============== + +Es wurde ein neuer Administra-Code erstellt, welcher direkt geflasht werden +kann oder zur Laufzeit geladen wird. Grundlage ist das originale admflash.spin. +Aus diesem wurden aus Platzgrnden alle Soundfunktionen entfernt und dafr +die unvernderten Netzwerk-Treiber von Harrison Pham integriert. + +Fr die Kommunikation ber den Hive-Bus wurden die wesentlichen Funktionen +des Netzwerk-Treibers zur Verfgung gestellt. Die Implementierung weiterer +Funktionen des Original-Treibers ist bei Bedarf mglich. + +Die IP-Konfiguration des Hive wird im NVRAM des RTC gespeichert. Das hat +den Vorteil, da der Hive zuknftig auch ganz ohne SD-Card arbeiten kann, +also quasi aus dem Netzwerk bootet. Ist kein RTC vorhanden (wird automatisch +erkannt), erfolgt das Speichern der Konfiguration auf der SD-Card unter +/system/nvram.sav. + + +Installation +============ + +Binr: +------ + +Voraussetzung ist die Installation eines aktuellen TriOS im Flash von +Administra, Bellatrix und Regnatix sowie auf der zugehrigen SD-Card. In das +Verzeichnis "/system" auf der SD-Card werden die Dateien des Verzeichnisses +"system" des vorliegenden Installations-Archives kopiert: + + admnet.adm: Administra mit Netzwerk-Funktionen, ohne Sound + ipconfig.bin: IP-Konfigurationsprogramm + ftp.bin: FTP-Client + irc.bin: IRC-Client + +Quellen: +-------- + +Das Verzeichniss "src" des vorliegenden Archives wird in die vorhandene TriOS- +Struktur (R56) kopiert. Damit werden die folgenden Dateien durch genderte +Versionen ersetzt: + + lib/glob-con.spin + lib/reg-ios.spin + +Wer dort eigene nderungen vorgenommen hat, sollte sich die nderungen in den +beiliegenden Patches (glob-con.spin.diff und reg-ios.spin.diff) ansehen und +selbst einpflegen. + +Folgende SPIN-Dateien knnen dann mittels BST bersetzt werden: + + system/administra/admnet/admnet.spin + system/regnatix/ipconfig.spin + system/regnatix/ftp.spin + system/regnatix/irc.spin + +Das bersetzte admnet.spin kann direkt in Administra geflasht oder als +"system/admnet.adm" auf die SD-Card kopiert werden. ipconfig.bin und ftp.bin +gehren dann ebenfalls auf die SD-Card ins system-Verzeichnis. + +Wer die make.bat benutzt: Damit sollte ipconfig.spin, ftp.spin und irc.spin +automatisch mit bersetzt werden, admnet.spin mte man noch ergnzen. + +TriOS-R56-Network-src.tar.bz2 enthlt die zur Entwicklung genutzten kompletten +Sourcen. Hier wurden alle SPIN-Dateien nach UTF-8 gewandelt und auf Linux- +Zeilenumbruch (LF) konvertiert. Auerdem ist ein Build-Script (make.sh) fr +Linux enthalten. In diesem knnen #defines fr Debugging-Ausgaben und +alternative Locales (z.Z. Englisch) gesetzt werden. + + +Nutzung +======= + +Allgemeines +----------- + +Der Netzwerk-Stack in Administra wird erst gestartet, wenn er bentigt wird. +Auch danach sollte man sich nicht wundern, da der Hive nicht per Ping +angesprochen werden kann: Aus Platzgrnden enthlt der Netzwerk-Stack keinen +ICMP-Code. Dieser knnte auf Wunsch aber recht einfach hinzugefgt werden. + + +Administra +---------- + +Voraussetzung ist, da Administra mit dem Netzwerk-Code luft. Das geschieht +entweder durch direktes Flashen von admnet.spin oder durch Eingabe von +"admnet" am Regime-Prompt. + + +IP-Konfiguration +---------------- + +Mittels "ipconfig" wird die IP-Konfiguration im NVRAM oder als Datei abgelegt. +Folgende Parameter kennt ipconfig: + + /? : Hilfe + /l : Konfiguration anzeigen + /a : IP-Adresse setzen + /m : Netzwerk-Maske setzen + /g : Gateway setzen + /d : DNS-Server setzen + /b : Boot-Server setzen + /i : Hive-Id setzen + +Aus der Hive-Id wird eine eindeutige Mac-Adresse erzeugt. +DNS-Abfragen werden noch nicht untersttzt, deswegen mu man den DNS-Server +nicht konfigurieren. Der Boot-Server wird derzeit vom FTP-Client als Default- +Server genutzt (s.u.). + + +FTP-Client +---------- + +Der FTP-Client ist aktuell eine sehr einfache Implementierung und dient primr +zum Testen der Funktion des Netzwerk-Stacks. + +Der Download funktioniert nur, wenn der FTP-Server das Kommando "SIZE" +versteht. Obwohl das kein Standard-Kommando ist, wird es von den meisten +FTP-Servern untersttzt. Auerdem wird nur passives FTP verwendet. + +Folgende Parameter kennt der FTP-Client: + + /h : FTP-Server-Adresse (Host) + (default: mit ipconfig gesetzter Boot-Server) + /d : in entferntes Verzeichnis wechseln + (default: /hive/sdcard/system) + /f : Download + /u : Benutzername am FTP-Server + (default: anonymous) + /p : Pawort am FTP-Server + (default: anonymous@hive) + /s : Datei auf SD-Card speichern + +Dabei ist zu beachten, da auf Grund der fehlenden Namensauflsung die IP- +Adresse und nicht der Host-Name des Servers angegeben wird. Weitere +Einschrnkungen ergeben sich durch die maximale Parameter-Lnge von 64 +Zeichen in Regime und maximal 12 Zeichen lange Dateinamen in der RAM-Disk. + +Ein Beispiel: +Zum Download von ftp://1.2.3.4/verzeichnis/unterverzeichnis/datei.txt +verwendet man folgende Befehlszeile: + + ftp /h 1.2.3.4 /d /verzeichnis/unterverzeichnis /f datei.txt + +Dabei erfolgt die Anmeldung wegen der fehlenden Parameter /u und /p als +"anonymous" mit dem Pawort "anonymous@hivexxx" (xxx: mit ipconfig gesetzte +Hive-Id). Die Datei wird in der RAM-Disk gespeichert (s. Kommando "xdir") +und knnte mittels "xsave" auf SD-Card gespeichert werden. + +Mit Nutzung aller Default-Werte gengt die Eingabe des folgenden Befehls: + + ftp /s /f ipconfig.bin + +Damit wird die Datei "ipconfig.bin" vom FTP-Server mit der IP-Adresse +des mittels "ipconfig" konfigurierten Boot-Servers aus dem Verzeichnis +"/hive/sdcard/system" geladen und im aktuellen Verzeichnis auf der SD-Card +abgespeichert. Von dort knnte sie direkt gestartet werden. + +Getestet wurde mit einer lokalen Installation von "pure-ftpd" und den FTP- +Servern der TU Chemnitz sowie des GnuPG-Projektes. + +IRC-Client +---------- + +siehe IRC.README.txt + + +Schlubemerkung +=============== + +Fragen knnen im Hive-Forum (http://hive-project.de/board/) gestellt werden +oder direkt an joergd@bitquell.de + + +Viel Spa - Jrg diff --git a/doku/6-irc-client.txt b/doku/6-irc-client.txt new file mode 100644 index 0000000..a078b11 --- /dev/null +++ b/doku/6-irc-client.txt @@ -0,0 +1,149 @@ + + IRC + + IRC-Client fr den Hive + + Author: Jrg Deckert (joergd@bitquell.de) + +=============================================================================== + + +Einleitung +========== + +Dies ist ein IRC-Client fr den Hive (http://hive-project.de). Er sollte auf +jedem Hive mit bestcktem Netzwerk-Interface funktionieren. + +Die Idee des IRC-Clients stammt von PropIRC, einem Projekt von Harrison Pham, +welches aus einer Propeller-basierten Hardware ausschlielich fr diesen Zweck +besteht (http://classic.parallax.com/tabid/701/Default.aspx). Der Administra- +Netzwerk-Stack nutzt darber hinaus die Treiber von Harrison Pham. + +Der vorliegende IRC-Client hat mit PropIRC ansonsten nicht viel gemein, sondern +stellt einen ausgewachsenen IRC-Client mit den meisten der blichen +Funktionalitten dar. + + +Installation +============ + +Der Hive IRC-Client ist Bestandteil des TriOS Netzwerk-Paketes. Die aktuellste +Version steht immer im ersten Beitrag des zugehrigen Forum-Threads unter +http://hive-project.de/board/viewtopic.php?f=7&t=968 zur Verfgung. + +Die Installation ist wie im Download-Archiv beschrieben vorzunehmen. Dabei wird +auch der IRC-Client in das System-Verzeichnis der TriOS SD-Card kopiert und +kann von dort gestartet werden. + + +Testserver +========== + +Fr erste Versuche mit IRC steht ein eigener Server zur Verfgung. Dieser kann +wie folgt erreicht werden: + + IRC-Server (IP-Adresse:Port): 88.198.147.76:6667 + nutzbarer Channel: #hive + + +Nutzung +======= + +Start +----- + +Der IRC-Client bentigt den Netzwerk-Code in Administra. Dieser kann direkt in +Administra geflasht oder durch Eingabe von "admnet" geladen werden. Beim Start +prft der IRC-Client das Vorhandensein der Netzwerk-Funktionalitten. Sind +diese nicht vorhanden, wird automatisch versucht, "/system/admnet.adm" von der +SD-Card zu laden. + +Auerdem mu der Hive natrlich an ein Netzwerk mit Internet-Verbindung +angeschlossen sein und mittels "ipconfig" entsprechend konfiguriert werden. + +Der Start erfolgt dann einfach durch Eingabe von "irc" am Regime-Prompt. Beim +ersten Start wird automatisch die Konfiguration aufgerufen. Nach Eingabe der +erforderlichen Parameter (s.u.) werden diese gespeichert. Nun kann mittels +Drcken von "F3" die Verbindung zum Server aufgebaut werden. + + +Bedienung +--------- + +Der IRC-Client besteht aus 3 Fenstern. Im groen oberen werden die Chat- +Mitteilungen ausgegeben. Im mittleren erscheinen verschiedene Statusmeldungen. +Im untersten Fenster werden die Mitteilungen und Befehle eingegeben. + +Das aktive Fenster wird jeweils hervorgehoben und kann mittels Tabulator-Taste +umgeschalten werden. Im aktiven Fenster kann mittels Cursor hoch/runter +gescrollt werden (auer im Eingabefenster). + +Die Bedienung erfolgt durch Bettigung der Funktionstasten oder die Eingabe +von Befehlen im EingabeFenster (s.u.). Alle Befehle beginnen mit einem +Schrgstrich (/). + +Beim Erscheinen einer neuen Mitteilung im aktuellen Kanal blinkt die Regnatix- +LED so lange, bis eine beliebige Taste gedrckt wird. Auerdem wird ein Sound +abgespielt. + + +Befehlsbersicht +---------------- + + Funktionstaste Eingabe + --------------+-------+------------------------------------------------- + F1 Hilfe + F2 /set Alle Einstellungen bearbeiten und abspeichern + F3 Mit Server verbinden, anmelden und Kanal betreten + F4 /join Kanal betreten (/join #) + F5 /part Aktuellen Kanal verlassen (/part ) + F6 /nick Nicknamen ndern (/nick ) + F7 /user Username ndern + F8 /pass Pawort ndern + F9 /quit Verbindung zu Server trennen + F10 Programm beenden + /msg Private Mitteilung (/msg ) + /srv Mit Server verbinden und anmelden (srv ) + /save Einstellungen speichern + Tab Fenster umschalten, Scrollen mit Cursor hoch/runter + +Alle anderen mit '/' beginnenden Eingaben sind Befehle an den Server. Alle +Eingaben, welche nicht mit '/' beginnen, sind eine ffentliche Mitteilung an +den aktuellen Kanal. + + +Einstellungen +------------- + +Durch Drcken von "F2" oder Eingabe von "/set" werden alle notwendigen +Einstellungen (Server, Pawort, Nickname, Username, Channel) abgefragt und +gespeichert. Zur Erstkonfiguration sollten in jedem Fall alle Parameter +mittels "F2" oder "/set" gesetzt werden. + +Die Einstellungen sind auch einzeln ber die in der Befehls-bersicht +angegebenen Funktionstasten bzw. Befehle erreichbar. Mittel Eingabe +ber Befehle kann die gewnschte Einstellung meist auch als Parameter +mitgegeben werden. Im Gegensatz zu "F2" bzw. "/set" werden hier teilweise +auch gleich online die entsprechenden nderungen vorgenommen ("F6" bzw. "/nick" +ndert z.B. sofort den aktuellen Nicknamen). + +Da der Hive derzeit keine Namensauflsung untersttzt, mu der Server mit IP- +Adresse und Port angegeben werden. Die IP-Adresse kann an einem PC mittels +Ping oder NSLookup ermittelt werden, der Port ist meist 6667. + +Der Nickname ist der Name, unter welchem man aktuell seine Mitteilungen +schreibt. Dieser kann jederzeit gendert werden. Demgegenber ist der Username +der Name, mit welchem man sich beim Server anmeldet. Dessen nderung wirkt sich +nur bei einer erneuten Anmeldung aus. Nickname und Username knnen auch +identisch sein. + +Bei der Anmeldung am Server wird auch ein vollstndiger Name bertragen. Da es +unblich ist, hier seinen richtigen Namen anzugeben, wird stattdessen ein Name +in der Form "Hive #" generiert. ist der mittels "ipconfig /i" +definierte Wert. + +TODO +==== + +- offene Eingabefenster blockieren nicht den IRC-Empfang +- Support fr mehrere gleichzeitige Channel diff --git a/doku/FemtoBasic Manual.rtf b/doku/FemtoBasic Manual.rtf deleted file mode 100644 index 5f43836..0000000 --- a/doku/FemtoBasic Manual.rtf +++ /dev/null @@ -1,797 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf949 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Verdana;} -{\colortbl;\red255\green255\blue255;\red0\green5\blue50;\red238\green238\blue238;} -\margl1440\margr1440\vieww12580\viewh18760\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural - -\f0\b\fs24 \cf0 \ul \ulc0 FemtoBasic Manual - Version 3.006 -\b0 \ulnone \ -\ -Program lines consist of a line number from 1 to 65535, then a space,\ -then one or more statements separated by a colon (":"). Most statements\ -can be given without a line number and will be executed immediately if so.\ -\ -If a line is entered with the same line number as that of an existing line in\ -the current program, the existing line is deleted and the new line is stored.\ -\ -A line number by itself may be entered. Any existing line in the current\ -program with the same line number will be deleted. No new line will be\ -stored.\ -\ -When FemtoBasic is first started after a Propeller reset, if an SD card is\ -provided and it has a file "autoexec.bas" in its root directory, then the\ -line 'LOAD "autoexec.bas" : RUN' is automatically executed.\ -\ -The ESC key is a "break key". If it is entered, the running program will\ -stop after the current statement finishes executing. PAUSE and IRBRECV\ -are handled specially so the "break key" can interrupt their execution.\ -\ -Pre-compiled binaries are provided for both a VGA display and a TV\ -display and for either the Propeller Demo Board, Propeller Proto Board,\ -or a Hydra. The Hydra version cannot use an SD card with a VGA\ -display because the SD card interface uses the same I/O pins as the\ -VGA display. The names of the binary files indicate which display and\ -board they are intended for.\ -\ -The basic SD card wiring is shown below. "Pull-up" refers to a 20K\ -pull up resistor from the pin indicated to +3.3V. For the Demo Board\ -version, the pins are as indicated below. For the Proto Board version,\ -P0 = I/O pin 8, P1 = I/O pin 9, P2 = I/O pin 10, and P3 = I/O pin 11. For\ -the Hydra version, P0 = I/O pin 16, P1 = I/O pin 17, P2 = I/O pin 18, and\ -P3 = I/O pin 19.\ -\ -\pard\pardeftab720\ql\qnatural - -\f1 \cf2 \cb3 SD CARD Socket Pin-out:\ -\'a0\ -PIN\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 SD CARD\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 Propeller\ ------------------------------------------------------\ -\'a01\'a0(NC)\ -\'a02\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-9) DAT2\'a0\'a0\'a0 Pull-up\ -\'a03\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0(PIN-1) CS\'a0\'a0\'a0\'a0\'a0 Pull-up\'a0\'a0\'a0 P3\ -\'a04\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-2) DI\'a0\'a0\'a0\'a0\'a0 Pull-up\'a0\'a0\'a0\'a0 P2\ -\'a05\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-3) GND\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 GND\ -\'a06\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-4) +3.3\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 VCC\ -\'a07\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-5) CLK\'a0\'a0\'a0\'a0 Pull-up\'a0\'a0\'a0\'a0 P1\ -\'a08\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-6) GND\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 GND\'a0\'a0\'a0\'a0\'a0 \ -\'a09\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-7) DO\'a0\'a0\'a0\'a0\'a0 Pull-up\'a0\'a0\'a0\'a0 P0\ -10\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0\'a0 (PIN-8) DAT1\'a0\'a0 Pull-up\ -11\'a0(CD SW)\ - -\f0 \cf0 \cb1 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural - -\b \cf0 \ul Expressions\ - -\b0 \ulnone \ -Expressions consist of variables, constants, and "pseudo-variables"\ -that function like variables, but may have complex actions like FILE or\ -EEPROM[5]. Constants may be decimal, hexadecimal (prefixed with "$"),\ -or binary (prefixed with "%"). All expressions use 32-bit integer values.\ -\ -\ -\ -There are 26 variables designated by the letters A through Z.\ -Upper and lower case letters are equivalent.\ -\ -INA [ \{.. \} ]\ -\ -This has the value of the specified input pin or pins. If two pin values are\ -given, the first is the most significant bit number and the second is the\ -least significant bit number of the value. The pin or pins specified are\ -changed to input mode (the default).\ -\ -BYTE [ ]\ -\ -This has the value of the main memory byte at the address provided.\ -\ -WORD [ ]\ -\ -This has the value of the main memory word at the address provided.\ -The least significant bit of the address is ignored.\ -\ -LONG [ ]\ -\ -This has the value of the main memory long word at the address provided.\ -The least significant two bits of the address are ignored.\ -\ -EEPROM [ \{, \} ]\ -\ -This has the value of the byte in the EEPROM attached to the boot I2C bus\ -(on pins 28-29) at the address specified. If two expressions are provided,\ -the first gives the pin number of the SCL line of the EEPROM while the\ -second expression is the address. The address may be any value from\ -zero to $7FFFF and the upper 3 bits are used to form the device select code.\ -\ -FILE\ -\ -This has the value of the next byte in the currently open SD card file or -1\ -at the end of the file. The file must be open for reading.\ -\ -MEM\ -\ -This has the value of the amount of space available for program storage.\ -\ -CNT\ -\ -The current system clock value.\ -\ -PHSA\ -\ -The cog counter phase register A value.\ -\ -PHSB\ -\ -The cog counter phase register B value.\ -\ -FRQA\ -\ -The cog counter frequency register A value.\ -\ -FRQB\ -\ -The cog counter frequency register B value.\ -\ -CTRA\ -\ -The cog counter control register A value.\ -\ -CTRB\ -\ -The cog counter control register B value.\ -\ -KEYCODE\ -\ -The value of the next keyboard key value or zero if the keyboard buffer\ -is empty.\ -\ -RND \ -\ -The value is a pseudo-random number in the range zero to one less than\ -that of the expression given.\ -\ -- \ -! \ -\ -"-" is negate. "!" is bit-wise logical not.\ -\ -<9> SHL <9>\ -<9> SHR <9>\ -<9> ROL <9>\ -<9> ROR <9>\ -<9> SAR <9>\ -<9> REV <9>\ -\ -"SHL" is logical shift left. "SHR" is logical shift right. "ROL" is rotate left.\ -"ROR" is rotate right. "SAR" is arithmetic shift right. "REV" is bit reverse.\ -In all cases, the value to be shifted is the left operand and the shift count\ -is the right operand. "REV" reverses the order of the specified number of\ -least significant bits with the most significant bits set to zero.\ -\ -<8> & <8>\ -\ -"&" is bit-wise logical and.\ -\ -<7> | <7>\ -\ -"|" is bit-wise logical or\ -\ -<6> *<6>\ -<6> / <6>\ -<6> // <6>\ -\ -"*" is a 32 bit unsigned multiplication. "/" is the quotient of a 32 bit unsigned\ -division. "//" is the remainder of a 32 bit unsigned division.\ -\ -<5> + <5>\ -<5> - <5>\ -\ -"+" is a 32 bit addition. "-" is a 32 bit subtraction\ -\ -<4> = <4>\ -<4> < <4>\ -<4> > <4>\ -<4> <= <4>\ -<4> >= <4>\ -<4> <> <4>\ -\ -"=" is equal to. "<" is less than. ">" is greater than.\ -"<=" is less than or equal to. ">=" is greater or equal to.\ -"<>" is not equal to.\ -\ -NOT <3>\ -\ -"NOT" is logical not.\ -\ -<2> AND <2>\ -\ -"AND" is logical and.\ -\ -<1> OR <1>\ -\ -"OR" is logical or.\ -\ -Note that the numbers in the brackets () are used to\ -indicate the operator precedence.\ -\ - -\b \ul Statements -\b0 \ulnone \ -\ -Note that multiple statements may be given on a line separated by\ -a colon (":"). There are some restrictions on what can be combined on\ -a line. These are described in the individual statements' descriptions.\ -\ -\{LET\} = \ -\ -Set the variable to the value of the expression .\ -\ -INPUT \{ "";\} \{,\}\ -\ -If given, the is displayed and an input line may be entered.\ -For each variable given, an expression is evaluated from the input line.\ -The expressions may be separated by commas (",") or, if unambiguous,\ -by spaces. These expressions may contain variable names, operators,\ -or "pseudo-variables". If more expressions are given than variables,\ -the excess are ignored. An error is treated as if it occurred on the line\ -where the INPUT statement is given.\ -\ -PRINT \{\{"" | \} \{, | ;\}\}\ -\ -A series of expressions or string constants are given, separated by\ -commas (",") or semicolons (";"). If a comma is used, enough spaces\ -are inserted to display the next item at the next display column divisible\ -by 8. If a semicolon is used, the next item begins at the next column.\ -If the statement ends with a comma or semicolon, an end of line is not\ -inserted. A PRINT statement by itself causes an end of line to be displayed\ -\ -GOTO \ -\ -Go to the label whose value is equal to the expression\ -\ -GOSUB \ -\ -Call (as a subroutine) the label whose value is equal to the expression.\ -Note that a GOSUB must be the only or last statement on a line.\ -\ -RETURN\ -\ -Return from a GOSUB call\ -\ -REM \ -\ -The rest of the line in the program is considered part of the comment and\ -is otherwise ignored.\ -\ -NEW\ -\ -Erase the current program and clear all the variables.\ -\ -LIST \{ \{,\}\}\ -\ -List the current program. If no expressions are given, the whole program\ -is listed. If one expression is given, that line is listed. If two expressions\ -are given, all lines between those two values are listed.\ -\ -RUN\ -\ -Clear all the variables (to zero) and start executing the current program\ -from the first line.\ -\ -OPEN "", \{R | W | A \}\ -\ -Open the specified file on the SD card in the mode requested (R - read,\ -W - write, A - append). If a file is already open, it is closed first. Only one\ -file may be open at a time.\ -\ -READ \{,\}\ -\ -Read a line from the currently opened SD card file and set the variables\ -specified to the expressions supplied on that line. The expressions may\ -be separated by commas or, if unambiguous, may be separated by spaces.\ -These expressions may be any expression including operators, variables,\ -pseudo-variables (like CNT). Effectively, this is as if " = " were\ -executed for each variable given and each expression in the SD card file.\ -\ -WRITE \{\{"" | \} \{, | ;\}\}\ -\ -This works just like the PRINT statement except that the characters produced\ -are written to the currently opened SD card file. An end of line is written as\ -a carriage return / line feed pair (ASCII CR/LF ... 13, 10).\ -\ -CLOSE\ -\ -Close the currently opened SD card file, if any.\ -\ -DELETE ""\ -\ -Delete the specified SD card file. Any opened SD card file will be closed.\ -\ -RENAME "", ""\ -\ -Rename the specified SD card file. Any opened SD card file will be closed.\ -This is not currently implemented and will produce an error message.\ -\ -FILES\ -\ -List all files on the SD card (at the root level). Neither subdirectories nor the files\ -within them are included in this listing. Any opened SD card file will be closed.\ -\ -SAVE\ -\ -Save the current program to an otherwise unused area in the boot EEPROM.\ -Note that downloading a program to the EEPROM using the Propeller Tool or\ -an equivalent downloading program will erase any saved program.\ -\ -SAVE [ \{, \} ]\ -\ -This saves the current program in the EEPROM attached to the boot I2C bus\ -(on pins 28-29) at the address specified. If two expressions are provided,\ -the first gives the pin number of the SCL line of the EEPROM while the\ -second expression is the address. The address may be any value from\ -zero to $7FFFF and the upper 3 bits are used to form the device select code.\ -The address is adjusted to 2 bytes below the next 64 byte boundary and the\ -total program length is stored in those two bytes followed by the program itself.\ -If the address is adjusted upwards, only the last two bytes of that 64 byte block\ -are changed.\ -\ -SAVE ""\ -\ -Save the current program to the specified file on a SD card. Any existing file\ -by that name will be overwritten with the program which will be saved in text\ -file format, as if they were displayed with the LIST statement.\ -\ -LOAD\ -\ -Erase the current program and load in a program previously saved with the\ -SAVE statement.\ -\ -LOAD [ \{, \} ]\ -\ -Erase the current program and load in a program previously saved with the\ -SAVE [ \{, \} ] statement.\ -\ -LOAD ""\ -\ -Erase the current program and load in a program from an SD card file. This\ -program must be in text format, just as if it were to be typed in. All lines must\ -be numbered (with a line number) except lines that are completely blank.\ -\ -FOR = TO \{STEP \}\ -\ -This sets up a standard Basic FOR/NEXT loop. The variable is set to the value\ -of the first expression and tested against the limit given by the value of the\ -second expression (which is evaluated only once). The optional step size\ -may be positive or negative. If negative, the limit test is appropriately changed.\ -The FOR statement must be the last statement on a multi-statement line and\ -improperly nested FOR/NEXT statement pairs may cause incorrect execution\ -without an error message. Default STEP value is +1.\ -\ -NEXT \ -\ -This terminates a standard Basic FOR/NEXT loop. The STEP value is added\ -to the variable and the result is tested against the limit value. If still within the\ -limit, program execution continues with the statement after the matching FOR\ -statement. If not, execution continues with the next statement.\ -\ -OUTA [ \{.. \} ] = \ -\ -This sets the specified output pin or pins to the expression to the right of the\ -assignment. If one pin value is given, that is the pin to be changed. If two\ -pin values are given, the first is the most significant bit number and the\ -second is the least significant bit number of the value. The pin or pins\ -specified are changed to output mode.\ -\ -PAUSE \{, \}\ -\ -The program is paused for the number of milliseconds given by the first\ -(or only) value given. If two values are given, the first is in milliseconds\ -while the second is in microseconds and they're added together for the\ -total pause time. The minimum pause time is 50us. If the pause time is\ -more than 10ms, The pause statement is interrupted after 10ms and\ -reexecuted with a 10ms shorter pause time. This is to allow for the\ -interruption of the program using a "break key". The PAUSE statement\ -must be the first or only statement on a line.\ -\ -BYTE [ ] = \ -\ -This sets the value of the main memory byte at the address provided to\ -the expression on the right side of the assignment.\ -\ -WORD [ ] = \ -\ -This sets the value of the main memory word at the address provided to\ -the expression on the right side of the assignment. The least significant\ -bit of the address is ignored.\ -\ -LONG [ ] = \ -\ -This sets the value of the main memory long word at the address provided\ -to the expression on the right side of the assignment. The least significant\ -two bits of the address are ignored.\ -\ -PHSA = \ -\ -Set the cog counter phase register A to the expression.\ -\ -PHSB = \ -\ -Set the cog counter phase register B to the expression.\ -\ -FRQA = \ -\ -Set the cog counter frequency register A to the expression.\ -\ -FRQB = \ -\ -Set the cog counter frequency register B to the expression.\ -\ -CTRA = \ -\ -Set the cog counter control register A to the expression.\ -\ -CTRB = \ -\ -Set the cog counter control register B to the expression.\ -\ -DISPLAY \{, \}\ -\ -Send the specified byte values to the display driver. The specific control\ -codes, their parameters, and their meaning depend on the display driver.\ -See the display driver documentation for descriptions.\ -\ -STOP\ -\ -Stop execution of the program.\ -\ -END\ -\ -Stop execution of the program (works like STOP).\ -\ -EEPROM [ \{, \} ] = \ -\ -This sets the value of the byte in the EEPROM attached to the boot I2C bus\ -(on pins 28-29) at the address specified. If two expressions are provided,\ -the first gives the pin number of the SCL line of the EEPROM while the\ -second expression is the address. The address may be any value from\ -zero to $7FFFF and the upper 3 bits are used to form the device select code.\ -\ -FILE = \ -\ -This sets the value of the next byte in the currently open SD card file.\ -The file must be open for writing or appending.\ -\ -SPIN [ \{, \} ]\ -\ -This causes a Spin program to be loaded into the Propeller's main memory\ -from a 32K EEPROM "page". If only one expression is provided, it is the\ -starting address in a 512K byte address space made up of one or more\ -EEPROMs attached to the I2C bus on Propeller pins 28 (SCL) and 29 (SDA).\ -The boot EEPROM is the first 32K of this address space. The lower order\ -15 bits of the address are ignored so the loading process always begins on\ -a 32K byte boundary. If two expressions are provided, the first gives the\ -pin number of the SCL line of the EEPROM while the second expression\ -gives the starting address. The address may be any value from zero to\ -$7FFFF and the upper 3 bits are used to form the device select code.\ -Once the Spin program has been successfully loaded, it begins execution.\ -The loaded Spin program completely replaces the running FemtoBasic.\ -\ -SPIN ""\ -\ -This causes a Spin program to be loaded into the Propeller's main memory\ -from a specified file on an attached SD card. This file should be a copy of\ -the binary form of a Spin program as saved from the Propeller Tool.\ -Once the Spin program has been successfully loaded, it begins execution.\ -The loaded Spin program completely replaces the running FemtoBasic.\ -\ -DUMP , \ -\ -This displays a portion of the Propeller's main memory. The first expression\ -gives the starting address and the second expression gives the number\ -of bytes to be displayed. The information is formatted 8 bytes per line with\ -both hexadecimal and ASCII displayed.\ -\ -DUMP [ \{, \} ] , \ -\ -This displays a portion of the EEPROM. The last expression gives the number\ -of bytes to be displayed. The first portion describes a starting address in EEPROM.\ -See the SPIN statement for a description of the values.\ -\ -COPY [ \{, \} ] , [ \{, \}]\ -\ -This copies a Spin program from the first 32K byte EEPROM "page" specified\ -to the second. As with the SPIN statement, if only one expression is supplied,\ -it provides the starting EEPROM address. If two are supplied, the first is the\ -pin number of the SCL line while the seconds is the EEPROM address.\ -The amount of data copied is taken from the beginning of the Spin program\ -binary file.\ -\ -COPY "" , [ \{, \}]\ -\ -This copies a Spin program from an SD card file to a 32K byte EEPROM "page".\ -\ -COPY [ \{, \} ] , ""\ -\ -This copies a Spin program from a 32K byte EEPROM "page" to an SD card file.\ -\ - -\b \ul BOE-BOT Extensions -\b0 \ulnone \ -\ -The BOE-BOT version of FemtoBasic is similar to the regular version\ -except that it uses a full duplex serial port for its keyboard input and\ -display output and several "pseudo-variables" and statements have\ -been added to control servos, a PING distance sensor, IR distance\ -sensors, and an HM55B compass connected via a PCA9554 I2C\ -I/O Expander. A Propeller Proto Board or equivalent is assumed.\ -\ -The left servo is connected to I/O pin 0, the right servo to pin 1, and the\ -PING bracket servo to pin 2. An IR detector is connected to pin 3 and\ -an IR LED is connected to pin 4. The PING control signal is connected\ -to pin 5. The "console" receive line is pin 6 and the transmit line is pin 7.\ -This "console" is implemented using a configured xBee transceiver.\ -A PCA9554 I2C I/O Expander is connected to the boot EEPROM bus\ -using I/O pins 28 (SCL) and 29 (SDA).\ -\ -The HM55B Ena pin is connected to PCA9554 I/O pin 0. The Clk pin\ -is connected to pin1. DI is connected to pin 2 and DO to pin 3.\ -\ -Two different binary versions are provided. One uses the programming\ -serial port for the "console" (BoeBotBasicUS.binary) and the other uses\ -pins 6 and 7 for wireless operation via an xBee transceiver\ -(BoeBotBasicXB.binary).\ -\ - -\b \ul Expressions -\b0 \ulnone \ -\ -PING\ -\ -This value is the distance in mm of the last PING reading (one-way). It\ -will be zero if a new reading has been initiated, but a value isn't ready yet.\ -\ -IRZONE [ , , ]\ -\ -The first expression is the center frequency (in Hz). The second expression\ -is the number of zones. The third expression is the width of a zone (in Hz).\ -The IR emitter frequency is swept from the last zone to the center frequency\ -with about 200 cycles of each frequency emitted per zone. This value is the\ -number of the first zone where a response is detected (#zones-1 to 0) or -1\ -to indicate that no response was detected.\ -\ -EXPAND [ ]\ -\ -This is the value of the PCA9554 I2C I/O Expander's register whose address\ -is supplied.\ -\ -COMPASS\ -\ -This value is the compass heading in brads (0 to 359 degrees is the same\ -as 0-255).\ -\ - -\b \ul Statements -\b0 \ulnone \ -\ -SRVLEFT \{[ ]\} = \ -SRVRIGHT \{[ ]\} = \ -SRVPING \{[ ]\} = \ -\ -Send a pulse stream to the specified servo with a width (in us) given by the\ -expression on the right side of the assignment. If a square bracketed\ -expression is provided, this is the number of pulses to send (at 20ms intervals).\ -If no pulse count is provided, the pulse train continues indefinitely. If either the\ -pulse count is zero or the pulse width is zero, the pulse train will stop. The\ -pulse width must lie between 500us and 2500us.\ -\ -PING\ -\ -Initiates a new PING cycle. The one-way path length will be zero until the new\ -reading is complete.\ -\ -COMPASS , \ -\ -Reads the raw x and y values of the HM55B compass and assign them to the\ -first and second variables specified respectively.\ -\ -EXPAND [ ] = \ -\ -The PCA9554 I2C I/O Expander's register whose address is supplied is set\ -to the value on the right side of the assignment.\ -\ - -\b \ul IR Buddy Extensions -\b0 \ulnone \ -\ -The IR Buddy version of FemtoBasic is identical to the regular version\ -except that statements have been added to control one or more IR Buddy\ -devices. These may be connected to any otherwise available I/O pin.\ -\ - -\b \ul Statements -\b0 \ulnone \ -\ -IRBSEND \ -\ -The expression is the I/O pin number to be used. This resets the IR Buddy.\ -\ -IRBSEND , \{, \}\ -\ -The first expression is the I/O pin to be used. The remaining expressions\ -are byte values to be sent to the IR Buddy (at 9600 Baud).\ -\ -IRBRECV , , \{, \}\ -\ -The first expression is the I/O pin to be used. The second expression is\ -an initial timeout (in ms) to use. Subsequent timeouts are 10ms. The\ -number of bytes specified are received, one in each variable. If a timeout\ -occurs, that variable and all subsequent ones are set to -1.\ -\ - -\b \ul uOLED-96-Prop Extensions -\b0 \ulnone \ -\ -UOLED SETUP\ -\ -Initialize the uOLED-96-Prop. This must be done before any other operations are done.\ -\ -UOLED START\ -\ -Power up the screen electronics and display any data previously written to graphics RAM.\ -\ -UOLED STOP\ -\ -Power down the screen electronics without disturbing any data in graphics RAM.\ -\ -UOLED LEVEL \ -\ -Set the master contrast setting (range 0-15).\ -\ -UOLED COLOR , , \ -\ -Set the individual color contrast values (range 0-255).\ -\ -UOLED DIM , , , \ -\ -Dim a designated screen window given the coordinates of the left upper corner and the\ -right lower corner.\ -\ -UOLED PIXEL , , , , \ -\ -Writes 2 bytes of color data to the pixel at the coordinate specified. The color information\ -range is 0-255.\ -\ -UOLED SCROLL SETUP , ,

, <# Lines> , \ -\ -X is he number of columns of horizontal offset. Y is the number of lines of vertical offset.\ -Address is the starting line address. # Lines is the number of lines to be scrolled\ -horizontally. Interval is the time interval between scroll steps. 0 = 6 frames, 1 = 10 frames,\ -2 = 100 frames, and 3 = 200 frames.\ -\ -UOLED SCROLL START\ -\ -Activate the scrolling function as set up previously\ -\ -UOLED SCROLL STOP\ -\ -Deactivate the scrolling function\ -\ -UOLED LINE , , , , , , \ -\ -Display a line from the specified left upper corner to the specified right lower corner in the color\ -specified.\ -\ -UOLED RECT , , , , , , \{, , , \}\ -\ -Display a rectangle from the specified left upper corner to the specified right lower corner of the\ -display. The first set of color values is used for the outline color. If the second set of color values\ -is given, it's used for the fill color. If not, the outline color is used for the fill color as well.\ -\ -UOLED COPY , , , , , \ -\ -Copy one area of the display screen to another. The left upper corner and the right lower corner\ -of the source area is supplied followed by the left upper corner of the destination area.\ -\ -UOLED TEXT , , , , , " ... "\ -UOLED TEXT , , , , , \ -\ -Display text using the current font starting at the coordinates provided. These are in terms of character\ -positions, not pixels (range X: 0-11/15, Y: 0-7). Wraparound occurs at the right and bottom of the display.\ -The first form displays the contents of the string while the second form displays the decimally\ -formatted value of the expression given with a leading minus sign if negative. With the 5x7 font, there\ -are 16 characters per line. With the 8x8 font, there are 12 characters per line.\ -\ -UOLED TEXT , , \ -\ -Set the default background color for text. It's set to black during the initialization of FemtoBasic.\ -\ -UOLED TEXT \ -\ -Set the current font. 0 - 5x7 font. 1 - 8x8 font (default).\ -\ -UOLED ERASE\ -\ -Erase the screen (to black).\ -\ -UOLED RESET\ -\ -Resets the display. You must do a UOLED SETUP afterwards.\ -\ -UOLED CIRCLE , , , , , \ -\ -Display a circle whose center is at X,Y and whose radius is Rad using the color specified. If Rad\ -is negative, the circle is filled with the color specified and the radius is the absolute value of Rad.\ -\ -UOLED CIRCLE , , , , , , \ -\ -Display a one eighth circle arc whose center is at X,Y and whose radius is Rad using the color\ -specified. If Rad is negative, the one eighth circle pie slice is filled with the color specified and\ -the radius is the absolute value of Rad. Arc indicates which one eighth circle is to be displayed.\ -1 - 0 to 45 degrees, 2 - 45 to 90 degrees, 3 - 90 to 135 degrees, 4 - 135 to 180 degrees.\ -\ - -\b \ul HC-OSD Extensions -\b0 \ulnone \ -\ -The Hitt Consulting's Overlay Screen Display version uses the PS/2 keyboard for input and the\ -overlay screen driver for output. None of the commands that use SD card files are present.\ -\ - -\b \ul Expressions -\b0 \ulnone \ -\ -SERIAL [ ]\ -\ -The parameter is a timeout in milliseconds. This returns the character received from the 19.2Kbps\ -serial interface or a -1 if the timeout occurs.\ -\ -SERCHK [ ]\ -\ -The parameter is a character. This searches the entire buffered serial input stream for the speciied\ -character and returns true (-1) if the character is present and false (0) otherwise. The serial buffer\ -is not changed.\ -\ -TIME [ ]\ -\ -If the value is between 0 and 6, this returns the binary value of the most recently read time unit\ -(0 - Seconds, 1 - Minutes, 2 - Hours, 3 - Day of Week, 4 - Day, 5 - Month, 6 - Year). If the value\ -is 7, this returns the control register value read from the DS1307. For values from 8 to 63, this\ -returns the value stored in the DS1307's RAM at that address.\ -\ -GPS [ ]\ -\ -If the value is negative, this returns the next character from the GPS serial buffer with the absolute\ -value of the expression used as a timeout in milliseconds. It returns a -1 if the timeout is exceeded.\ -If the value is positive, this returns a character from the saved GPS phrase whose index is the\ -value provided. It returns a -1 if the value is out of range or if there's no saved GPS phrase.\ -\ - -\b \ul Statements -\b0 \ulnone \ -\ -TIME\ -\ -This reads the current time from the DS1307 into an internal buffer used by TIME [ ].\ -\ -TIME [
] = \ -\ -This writes the expression on the right side of the "=" into the control register or RAM whose address\ -is given. Addresses less than 7 or greater than 63 are not allowed.\ -\ -TIME , , , , , , \ -\ -This writes the time / date indicated to the appropriate locations in the DS1307 clock. The values are\ -given in binary and are translated to BCD. The BCD values are also stored in the internal buffer\ -used by TIME [ ]. The BCD values are written to the DS1307 in a single operation.\ -\ -GPS\ -\ -This starts up a background routine (in a cog) that discards any buffered GPS phrase, then begins\ -discarding any buffered serial input up to the first "$" character which begins the next GPS phrase.\ -Characters are then stored in the internal GPS phrase buffer (used by GPS [ ]) until a "*" is\ -seen. The next two characters must be hexadecimal values which are used as a checksum for the\ -phrase. If the checksum is invalid, the phrase is discarded and the routine begins searching for the\ -next phrase. If this background routine is already active, it is stopped and any saved information\ -is discarded before starting it again. Once this background routine successfully finds a complete\ -GPS phrase, it stops itself.\ -} \ No newline at end of file diff --git a/doku/Thumbs.db b/doku/Thumbs.db index 74442991e82e7a68d19061a7d9ee18b46ed39199..651471d6566d2ed25026fe7771348207cf141d27 100644 GIT binary patch literal 63488 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 E0B7@^=l}o! delta 7596 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 diff --git a/doku/TriOS - Logo 1.jpg b/doku/TriOS - Logo 1.jpg deleted file mode 100644 index 82b891eeefdeb1fad12c8e7ea48ea0f975eacf9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19783 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 G^#1_*yW5ih diff --git a/doku/TriOS-1.jpg b/doku/TriOS-1.jpg deleted file mode 100644 index aa72063ee624450e45657fa209692260c1805727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41871 zcmeFa2V7IxwlIDi9d#^V1r#ARWJClJ1py)BARr?b7 zw%6WDx+HI*RY#3YjiCi!Er5=Ie~@H+nZfb1gg`>TS;G0vnreHX1K*pPFC1TX!aacC zLk#pH_(9-W^$`~O3jF*1_aoGzm2$@Rn@xNOXHNTUKIY|lHqgt@bMqlTPapS>Wfp*8C0bkWZjjAkpow5Q?ALn^}I`-^(v>v$4-<&j3*Fn~xQIycT@w&!S~ghJ^E% z{6Dtw3Ffy~pWZ32T6gsH`O|*x0q&bWuLN2KivM%|=U=V(?YW6R zfq4ESAwKc#H>xjPY(n&MbN}>o6?g-v`PFy7eW2eU6j$1uIJTJ(I`F#;vVr`dK*$Sxd?0to4cZO;M&nOlpMCv>m*C;2 zvY?KCc74Kd^=eZ?!_78+fu}t^-QE5&d=~sZvewD|hQI0I%_i=C?*69(!2tRGbihX% zeZ=L{$XT>vy@h-5W;-uGH$rg0=96cMzGwVSd-(vQ&H$K?Jp){YHh@2mL(t|o;JGm* z2Q85NOEYc)k~-u@I0KOV0hC!FVM0GaE0!)@`pwc6-+Z%T_3~xQSFe{|u|j&i+}gG4 z*RGXYz2ejL`_FGTUw$uGxqSIbsgtWva+qSPi@#2i; zKL5+jhD(%Utv|e*at+uolahaB$Kkk>ZbmOt1GQvZYzEw?3x0alN*tUqR=)k{>eD-~ z+urli3M<-&__iKF*W%NQDm#V++9r0M!QlxR^s3I0+11cjUxD5(`qZZ-i@)CgsS8^) z)+_=&xUhBY*L#1wweDjNUYuzDpt=3bJO9hEhSuv{1NKcRE&kYnB|G-NYyq7}m31?+ z(F$}Q_-hyb^&TkytqYPKXvM-$ZLWr}5YPJ7O{ckhDD($NYGFj!8lmywDr)95L2Pu! zjgP1L)R&jC@I5L;mEDN;noUl_rM(>_^`UR23iwX@o*0znf1?;ztjHGo`d><&Y6@0f zY!LV=+G*2)y&pbY2)Sq}UE3eC^XBW-*AA~{EJ~ilZ$q~TlO)hBv(9P>bc8%Cf!^C5 zK@dJ^a-0Q=l|_8?kzd?Z2iS^~X}%k#4}+!b2EIK1|;kJq%NhpicIYlD00wb{)VRqaTpN54vF ztNYcA3GdZM8AId;I5Cg!igin5=b*iJcS9U6Q6+xO#ArL z*cMDNV}4y(SPU=ZX}0GAb)t&K?2=069@3H!Z-=^eUs=iL0WWL0_|^uOyHh+z`N+vmgj7NKNYV*Co(( zW&Ga=eqzIh1@%eWW%sT6?(MUE0td_=={<_PXxY1WXG(TdhlA_J%CU=a#pS9ePQ_HA zz2srF^M=s}!|Vf=0^U9=!>Dxo-#ct7@c4G^w5jCHXaPC>?R)-;Na}@rCvHyutD;{w z4mgeYNzMB7mG(55f5WmWx$tE1!288=i;y3xCNU|UdIY}R`Pl4>sw^3?R63SNgWk^0 zeS7|cFo_&dA%W_p;xv&H2lWTVa|xo_7nSl;UL|#kE-jr38@qd1>CFt$#_=^rLhU#u z+$txmtzs~`Z8nT@X%@YKdKOo`cm=0bPURwbxSk`gpXgm&@MzCjld^_jHjZwj8bi$v z)p9*mUb=C(uHPZAp)(Y>zDqCxDCK9R=p%CPc{9C4-Vy}ZVP(Mf?A;hr!=9p3D6m!PB%lx zp|jxcK=29p^w&oyZe+6Aig@~Cli)cJ9v_)1#)_V^74IZomEL|G5WP$s4{+6x^}5zW4qy za#BM4`Tm}qqSVL^0+HzMOXw-k$Ps(*pnWiN4|s;3raMWXSA`O2Ji+p$!LCNPAsy=^ zxyVOKa&0d(_;Ap1eDu~6DP2IVI>7U$6fs#=0&PF>`K?u~)1)Y41a5dIfn=4%Iqm}2 zUZBDMVF@#_^$cSe2)YQM{cNe-G5+D=3+@tVXa_t$hZo&4`|QrxRDIqOD8{5$Vl_+D zk>;Uai?C$Kh@Q4gve8N)#QLaj$ znstoNZ{1=+U82eP=hy*YJG5v0iNT*dm^S)z6#X~MgKrp)V?pM3qei=jk-K#+4P7C7 zUwNwpP4>u>8mmf06}}#W5@;X+3v95{@JRn7iu7Dv<55jzMaMpcIBQIiD1E|);DJK@i6zpYUMJ(y?BT!brXBoNhRtg0B;>Id>A&~zMD zBvKb2N&EaZb$h}eWvN|(;*hjxpiTnS9s{1y2gdx?pC)sHw0Ar=3G|sFWs|Z!#`GN= zGUH2w$5)njx><`uiVFO(Q)WK`m#F}rnKZYol0X|S)f~AJBVDHxR*e0A4Q0N4lg7mV z5b`{9=I7S>q?Cqeh2mppY_1T)cX=R3k@cq88?EhW;ILW|b+H00?&dEN!BYwM zZ~uJYgQy^(E{?Zlrvys2dZjp2{5g^Tj^;p({0DO>;d7=%#^V1cjvd8sEXS zeE||ks#5|LIqL_SB?FCmr({H|K$Ac|B_Wj(C=xFy$Fr{Nz$8D9HC0o}|Ic;29G*#_ zxip}4U)tm6XES#zCB;af8^D(lDFOSQ5)zvrTazTbB7u$$9%2u(x5pmcp7}?&FfHlU zM|f$G5(r09Le8}~6l3Pneg*Y8Fy?2|GtY;O2=8Hex8J~L1Azy*2KbfR(?A6~&9teo z_L-oW5z0 zkQs*;$kuX`m}Yy1Cu%tatj3?X@9AUk~KOAJ7$=ugDoA1ue(nrptDD6-E|?lM*xVNRVAQ z%@W;zG?#F!k-kfN+s2L#{|i%IZaVcBc)M#$w`SmQ!Gqd6?$ZhiRH9}FLnm_{q}gO0 zAT7)s*w?RMQ>@w~B%UniK4|GYBXxHyG$0>$=T1qo0NcsS=9j5RphMTWA@=ygYq zT$ekV`a*HbOz8RfGO)U^8}W^Z%OK#{Clhr_MYvgNvcvJ$DJqLK)> zxnQ1Vy>0$RcHUBw>#sr=_rs-QUG~Hgz1=yXSwu^|%ZQ!pE?&0xxwLp&P7Zw>lje?Z zCOF(4;D@QD{m`MQ&>c<9!n^ONLX3(x+`VTIx3|I|Rl$yiXOk;DGua_7ar$_d$9$=n zxK>@v3BO@n1pbhpELEvUUSn6?Y>2!|)6rqK32_{vPoangZu*OguKXOQ`AXUeZW4wW zwu;YT`4;;e#4Z+{qPL@iiuD<8g?D)+PlPU;Dk~b-4fc21cOZ9zyI`XvJST`8$CE%Q zc}Ix3_X+M_PkN7aDYZLxXml(tN!;s4JagYEN&jfknfK+{lvXQ5y|wKzvl)rEiGS}_ za;<;%?Y?Do0^R4EGCa#AP-w8VpP64?&TG{5O;=N=A0KO?8htC-!+FdzO>ppey$@GS z?R;T$rBInOR=HlcG>I_QBY`XhStRUJSi|!na`Bp)WAz|*(4Bj7=-DD%X zrqoeuV(!HS(RpL(H?oV{tvQ`Gf-&CIG;G6YtwGmRJ#13&UY^lTlqryXJoKJvZC2jW zOd@^HvQyqLz{nf43c_h{O8GaC@E#3+6*{IZmpY+%y^YzT>+*H*zD);%T;K0ca5f|v z=Vv9w*F8a3WM3OZg2^ddjdOK;31mi+u{se}Om2ZSW^UUwl7dYitjhxio1-rqr%2j?5NG9 zXG`Ke>|FcC`bPcgXs$&F#gcb)fdk%>2$5POKmjaw~P|2gcLxMHLn4 zeci1l4i_{Tj#C5)9ahMTxV9%He#YdlZ)=VP;z)N`*5fR8LA$FQlCM#Q`DL=9c$qjR z&XXBbOvxc`I@V#TYZoKLwtJ(D#?mp_5SX79kbRm-Y0-S*wcEGYUeM|gb}ih#%C-f4 z*vKqqmE6_8`@Z7ar0X|l7tQ&HoZEy?MK8S)eeG?ux)HX_%;C_rw{7h_(AImOO&7zI;=D;nNFGObO z-oHK&d2x#(qn-C{Tytw`7Jb~|_IsHp)_3cVoq97ck}x>vj>=31^me*A%@#*>+wONM zWTd7uPjFE~^>kijcCRju)Mn%UgFe&yY);IxZo-@iofk^dEfe6_5=g@?GtS&LP>;ja z=7&6BIgb4hl)&)Lb2ipeGtyg1JjoK=w{=GfZ8&&=Qy5M?mkJxg|B&`c_Qp=zPyS+z z4aD3wYn?E1Y!=CTZI8_^1|jvMC&1V3zt}?m7Z37$JOac|JXgqPrLgket>I=78+P+` zGoIQx&qeo@5*TgbmpxzDbUU9UMxWSqWM!4?yc22rm1bH?Ns--Hq+dpRZssf9ET5D} zr%=*&+zs6F_zq@4Ze4)G1iEtnSXNRl3?^Y>v8N-uK7~pze?gwKD9I{flEU4YQ)hGQ z6U9xQqyD6$3_Au-7712yeZ=2bPUDG_ZKAYKx0_#D;a+r{X+%WSa_)7F30*WvzV{T< zYzXvb;eJX=dAlQxIzNYMVm7MOR;Tx7=)SlW_w#gb1SPgp)8IF%v$VmgcNyT|CxdJ?L`0S znOIR)Vh^e>W>5to26fJ=e6@U5Gg6**uK!dc@z681tWu{@EvHWX9G|t%tZSk&Y^?$!sJ;m&#%M()W9McEJ9@{$=!15Ij5rV3 z9`yo62Csy4l4x>9CXjZ-t?XCX-sxXE;Gal`t>RgD!i+(VL9_&FVRA!Y&k~&~*-iSH zhx@*{00L$k&R4Z_P|PI!4m+}{MC(=B(EEP>sp&cldF4PjkhOAXyVc#!qJ;8Uo5Et3 zgc-2XsLcUpD3AI)D=>?Yy2_fYZ(k9u=V0FSd=+V;h&h?Dv6JPSn>VX7o+rTaI-G>6 zwrvjHk#82(mgn=9rJFI@DjfRO^5H z**T9rkq0&_-9YuRBdJy{7T38aH`Sl2liTB4QCm~QRk|9!VXjc8C?rW=+H71F%__ae zv3AEl;+5&GFI6q?J>;?KY*EM44uW^jMg>Ko*EQ#obOj0I5&X+6gQu9QJySUFo`kEf zm$Rs;iFh(vz1~rAHgS^ltXTg*a(}|ON=a}xJWk-%eVefrA>ptlg{K=2{MfFQKJ4oq zOVNGFTv+IlNwTAXIi7Rcy_RU&ia>807I>-_T)*bv`ZYU9ZhIZe{t_$!8O z%<1jsUnTkw8&;-u%OL68ofSb`g}cKcE-?iy;$R*l<&D+IyIJX#3#@v69(cD2R!$v3 zD^}hv2%+=DV4*x54}4hCAurYb92A=ZoF*zgJ-X+hy$0&%M2&&m4T<&|=5K)lvREgYS8uKfJ|MN!y>k-~T$_ zul-M+{;%U{$G^bSdV?o?zlJwj; z*S6?;!00MdU`im6UN*x>5ntG4@RV5FZy%CtcAu5T9<)BSh+Ei5{d(NHNPG^&{BAPV zQD-kXbLYD!CD2t}{OA}zIQmE0$QFiYON)ztKZAdDT-wvNu;G0CGrJpymOMkPu;WeH z@Vs|0S_nk(bC8=hy?j6dG3wxVK=!tqF`5suCaOfI5EZjVh9AjQ0@dLd(JP(~Gwm6|>V(f* zgsU+TVh{=dwt^dI@u&nkJOh_vrml=;s_UY~d=N+64U~OR9z1(%86_L<;8UCW;b-RwB28s+mK~y;go4bB zNQ}`xX)NK7jnR0P+QK{#_BFT>J40hq>;VfpCWYRz66n&JFYs5NUpNJ`h8Q2}DM%)M z^Z{YkRlJ9^UTFkRHvm-(<*)=D>f&i7VE`8+b_7{xzGo!R|;i4;Zg@B*kizJXv91rH;J8@SgmCn$YTBj4U85u(GHaCxKRgh48F9;_D!xHwZhpr1^vk z@yqe^`RD?PykvEuh%Vj$M1;+*|6!Bmi*$u&O`j8HRZ<(m_4lbGSUzYGihpPD+@qH!fnIqVxzYo5a*ncwkc6^~OO#hL(_%9gq*`GTtUsA)4Xi!SL?Le?D zZmPUg6vrN1NmDJ@RC){_JW42h@E)W`tQ}~+wIhsCcL2yaZ0k=C#a>I^ZTd~+p7`#sUS0n8|N2CAA!~gkK*`GZ8orhKpAJZx@Vg(Ra^eMSKfc?z; zx6@s6g3}EvvP^#zYvx-GOFH>B@9|)Zm1_bBi|qnwl_axHyJ(bH zSBl{hY#Y>)%zm%k`u_z1BN1()P!$9RLDEzDAp@{CIYn{jV8#hJM7y`!=91y!}L>q|YV zlCudpg%t@prC1|GkLpRau1^6LX_5Tw^9g?6*Up(HCW1hBdZt zWnU<;9G)Y*LB6GGjys#6N?1WFh<<-ocU!7>PuM|7zh9XSNz;++}$P9KcTzu)F z%^&N2=zNb~-Wj2ibYGF3*?TRYMqmTG`Du3;{O|e>M$IdY+e=@mAIs)O z%qoKoT^+<&2g)Dm*7C3k=;c<)}}6ZB-cDZfGpy!H;govKZr4GR+WF<55I5cdR&6TmpRjgH#~YV7n}!jon+nhN zS1`Oq<1xo5B9A$@rEBW8xJJxB54TL1b%K9}E3x5WdfI*SHBC}3tK+U*c7W}$$J{Hz zdoS<1rO;B4=-BD;re&t^hc|CcFQYjqp>NFfewq*ide~bF3lvzwHjpx_QodFkf}gXs z6n0QVg>#ts`QP>~u6p$IztS1gzFj(LIYGWF)%EOGN-esp-oxrZ`zv*7;93fBY?2ei z>l4I${B-AAcx2@FO`pcG+GFHYkXHp{Kvyt4c>fwnE|0+6$Rj=v0g1bW=C<(X0X;xvD&3y$L%wS(L@yRfi>$9GQaJxHK zyo@oF@#0%bNT5nnL6U`f0&iVxghsDWT;E8&Hui&=`PSkvI-A}q^Z*MnEdRXEsC-KT zMPZi758dVFsxoG?5=4P>+sQtyQQX{3uPmolJ&O7aI^lCdVWz2Ifi4Y%=H3HBnTU%1 z$fAE(68~9AyFW_`+rFUfpA?$>C!_CA3jIl;-v#!6g)}KZm?1HymAMkgF{#Y#YaB^d zONmwxh=R1((YE^xk?R~mBS~?Ej?%$mH;us<`hh76^4+Q%VH)@tu}+xm_SahyJx+9m zI+&n!UP=kE!8%ME3==hZNtsaq_NZ;!g`vC8 z2KUN4d0xXKcM3mQR>D>Zw8rvq?2FPYewK3Q!#jp7E0#@E#4aY+dZJ*yr_4A60AA@2 z7s8L{ti`SjUe-1#f7LTU*e?gRpxsAfYtm9=s=vmJ;_1j~^6stW1f25|F3owrKdpfl zI>2%zneCz>lU69BEexnd4Hja9amCKxgQLKzitR43RTy@5M7;gMb){S241`D|s_TGM zZDwwlPlh6Q<0dHRC8vLQqG$LQhxU+m7aG-Y!{|YqAWpWts@_17M^iHs*##R<@@#iR zUNY5?tJ!v;>ROdpmo{%$O$OFfhz2dNTBFau<8>aEB`mH^&!{Wrl-ZlfmsvluZ8!% z%X_pzuG?_t0a&%OA#VxaGo-oU%ZVFqhR_~lidn+ENrf_u*WF!&TclreJ!WN(}(dw7ZFgrs%ovO4@|30DO8quDp8 zsD6y=l}bhV>)zf~)qZ{PVkG?TqQN&f_?<)Enc>6JO+8n`c%F}MyH8hYqMbhx=?jPz z4~r&pFIOhN4lR#!`cUZ?x>uhvr#zwTTf9gsL#JMi?lJhJOP-xn#?)>tJ&!gGC!B&S z=pCMZeZqqi^3K}0$DKWsZH(LDo^yFfy%&$FuM@dsRDO4W^hF|khQMd!W-e9CQw&zv z7xGP*U0ihD@Q})qH{0SB-s_^j#?(}7KBm!=^pIK#i z|F-A1KadVqrJs=-bZu2{jW(?ljff9SZ!V|19XJ^4uj2R1S%uO4tR!Jf*Uxo6Iu?(f z%RG5DmDy78ge{it0NX1uAGlO-G(;jd1RFn$=fX+UCGKMdkzCTy^_h@^D|0$ zsD??WfA1NTrw*0}vSmKcj&|NhYWhLabcQLo(94K3a)C!(ZHn21c0OamEn zy{H#DCM_gSq620UNS=~|Edx6n3Bd4wZu+22C|$Ih#+!TvH%XwuOAJ1)VS5Q)7Wz9xuow%x~Qn$2i6SO zP|{C8ZQp%Sg%Ys9n>r}{U~dS00*vA9WtjqukBvBajsV;p5kXr_z4RynbnbH~##AxV zD(u1tP?qp@LZQK{@f(a*#!8S81t0;x+X?$(+3;sTVr{G=9J)}<0#oW@tRSO{lxK$o zzheMLXzDo&$r+AyR{tCZkamP?Ie7|Z&cc&xTt3nRD)4O9HLwc?z|FuMdg4E$d#Lr7G@CJ10}-UpxdRUd@H1wgV8?}w+3V`( zNa4)&a0Xdk3!TCyBbz)bl_pv>hTN6#NH$!sxrNOG%V+dG^rUEab_qwww)PJH14}6`hfk&T@gTG@U z>tlyxEdMxmn%?Q(;UCmfJ?|t$ej(wxtL4UhZU}WfSdN`UD(a zz{@I_QN_g|bbf55ZmGrx#j4Al`@6Mn9%^m~u(Ui@QyZ{m^I*lqLd9w2cM1rf0cFPt5~M@ zp7BfQKf`5r#7XUZ*i_W{P}CE>vdnVJ-Q5Lyt|Z;?-yQ0GYPYJ;pkr{t`z}b_#%Ajd zzlZxmrWh|K;RZ#zfKrHtr;{>JEX^~svS|eNBp`~fjY;;%%Z4P4kWkW&vE048(_>VS1hC&0)lU@LXp%=#>si;NQH|?H|_Qbs4*R`9Vg;eD`raoD)vv%_#;5 z9+0}m@?w00a3&T{LW4DEHN|}VxN_*-;m{!DF@MNiQ{}mxqtA-^eY#bPCqkvR6~LzK z!aG90;5ikpzz!uoHOS(>U1*H4Snx0ka&v%A2ESp=>xq`5?QkkMnj#5fA3P~kw`7%) zC!gZ<1c<>SaT7vL7^TChM?~0r`~`K;%1)}xPn8bLPYD)!s>{{U!Kcm#H8XmVb16?+&=XxSxOT%izgvm~6 z_IY1U!o&_I${wQ?3u!J+Vf}p{kc?OC%D1P9oASsOnpxE~#II89XQH_Km|Q>BD9%DV ztthcb8!=(S%^~LkHTAp84i7q;`v?u)i%xP^pcGl>`s!5iLtiVt9nCfB*&Ipt)`C12 zqo`HOAIOihSq%4RanE|z2_#1#Phj_{FrDQe2p^2d$saE6(++MnLop2(jzn(SYPGtx zCt-s8Q~r7KWrLym3-ys-t-gIY@PH=`Wd7DPsV|w=PI~-gVBZs&H|G)0$DInzmN~(> zYC#?Q+et}nLX(14UYX?wZ@eZFw76+R-%Q)2g;%zVWX}44Ju6fLr$O<{fs|iN(|bfj zkURDikC#GYb1g^J4O+(a!6#l;F~;P@58zP-w-#iyoDAt#o6LX9tJSUq#-nh91~1r$ z-Oxw(U;AFCW(_G;`(ah2=tDF%DTZeg7dQOqSXrV$?&^s%2{U&Gui2?#o8MkgS$uz! z@w0+m>1(5VgCS1NS(f#Amk&@TYl-vFnzz)e*Wh)m<*b;Le! zOoSNCiUnTD=WP^+Wz%w%xr+Gj*mL&98|?2Cb>`8wFV=a=2&UZ>$uRnE;pf!RZ-1V% zJP=&DZRA_H_nun#OF-fS+cwJj-^Wh4D_>H&CBRGpFYNXlOE3-#dlI_f%5bsuAj|~K zO`Z!zFu$cSG0^1=!Bye|#1;q4X$iCuGjACsf&4(QwJehqE;hlaf1(lK(SKz?uZ#+h`)8ssDehyH!T^uojZHSoy8C-=YY#D%L9Wd_z zR=A!Zfwr{(IVpjF5&!0`1RAqph+@pp^^IWL1h4~Q#3=qBH)>bIhVAomE7EwU6Fhp( zKBn*Jl3MSapniV=*n;IF?!o`H`(W-H1^hlPyZ-r@PC#~n#fkmEO2VKBqd9D3K2L0* zE)-<_GlIb>#jF|p%#;LTQBm1OI0-ZOF$L}4Fpd7>n@o#p5$Cz}-7)+2mDJ0pR$f8o zPn^zWs5!_j>1Gevp@n}Z71VildSY)e87t%iJep=)MPc~a@soFGU-0(tSopX3Z-=OZ zt;br}stPct+f5z+p1prJaQ@in{C{tww@Y9%q=NEe6vbT5m#UVI$Km77p7)KCd4ly@ zn8fgATmmxvACK4EzfF<=mNWdm7Z&Zs&h&lsOTH**kH?X7`9h5+qh)vRAl*3c0QEfa zI}7vj4`aGP1?~hpv2=C70RyF);kuY`Mb)_xoeRcJ8j*b7ODFSavv<91I`;$O_iS66 zIanD2lO85}ng@4~pVm97Q}sldB|I_=hh;3^V zJ9%q#ydbZAQ`VCy|0H%~g4<-ZT#;jMl`f;(=3QZNJYo=&5zJFT@pc`2-}gMr-1$H~ zjCvL+CA<>JsjUuOq0rD<)izw}om9L482IH+8LRKA*JpMS^+*>hfd_e^Z_<4S#XK5S zq9o08Tk>Y?w~dR-t=_(kOkMrJiOjlWDO;zW&>dp9HkT6Tojpk3W>Cw*`MQQQIpmFp z-mhHTR~NPk*XMuG9KB*jS0=X{l++X z)Sztv3Kn*cknWfSq?5|n%4jC1dZzjY@NrzzLi(oKsO-Y-l}}hf?*by6Jq(>kC;0sw zDl2$~l6vMAu!f(OP3nxP7sg~&ky6;iAe~OUSySp{7WaYBmnKq*>HlGP&(gu4hox71 zTf23`fby%jKD5HB)3Szk?@9~P*g0^}r$9Dsz#U1idR8L3(t_Gut9DiCz5{FlQ^afn z&MX*f8>q?*%wCrHI@Ityd{(cG*qKmL0##Mk3U~Wf32lVFWI_&dG@l~Cg%G&whsbR? z>rgACdR&vDiK*s*-;_06(&{OlrO#cm5~%=o-}E;Lq>$8QZN}MiEA2eb0FP z*`|i|4pHYHK3ayH4*(+hb#>l&K{s0*9bO>X+V0t1-s(`-EznGQv%I1?@7c(j>7HqD z%t3QEdoXmbAJfK;9LxIt1~@^qwu`io8~?TOeZ>@wa{=^3c1?Lv!YcXaMJ0)SOvkq6 z29HrUdOP3W3(lSLW#&Ged_suGNyM5G*uLmCMoZT{HP1TZNRKwQ zv|;o0i{26&o*7DS$<5_#dgr32i_eT4E}R?Br{wqDf_pTvFUb!POXDkeK7s3JvH#+| z4P&J;cX^KswvN~~q_%oySZAtwR4PRFq~X6qhHSUIpgz9wq0Z@5WN%Uh4sVdEzuGRN zs9}ONZb8wjtG*Zd!;z{hM?Bv}!lCmtJb%h!>1ut3@@>;V%nSx-*hfGv(p7=`9>^HR z0!?We0Za>^{+@GKh;?=C|yL=iS7h^n|STLT`i!_FqF z^D>mh=fRrlC3tfE3pG|m)1wmU&)dg;iCxQm%KR(9mLY(f-J(*mxdelFOkOA=8Rae@wgHT zW9v+!Uq0v8%*G3G5%C~Ql|>`uS_+T*_**lRL%TlV`kYZg;Zfxx3o zH~jImlNvn$WUnh!6W-aZbi#JCfZymWz%%<euUATfi2}G|S`l?(NP9+})7XF%s*AXBu``)Ms zu_<*Ic4fD{G1~87u5hAc+(T;wE8Rxm*ou?ZHW%AMUhwQrJ6uCkO@0q`{R&mJ%+?Dz z-t>^P#?tf=QhMp3{bT64=Y;$a?5y`VLvTxWAy+C0Z@X@p)0myx`+?%9it4kETsPei zcY4~w^H`+>=5;ojn3YActmmQL26dh}D-x6L+}=BmFxtuvxd+P>C@Yq*+?8TdxKo*& z_CYrsE;ECd(C#_2uT#`#li7}_zDjJO_I-ydZt^ytOHbFI;jk>Wm1Mq7-P$KWir2L| zcZAH#vycjLN(*&v=NqIriPEO4rF^_;{odYMYFS}(sW;BuCrs8cSZ5-L3%?~<7Kka$ zLR;h5ir0;`uPQR6<$v+)jETaXOM8&Mx~Fo1vv05X(MYMc{CqW|NH<1o1wU9Q zSCPVZGk4ZTCq*D&FL!m{D1csp+HK?A#eUCVuj7cjIM{h3aGWN{@z`#wrY{(FCtkxh zYmVI)IIgsFweeM#v)>=;ufo}fv&p5-O!o?wes;g@b80sm^fpA)3==4sZ`BSu@^+koy(t_5SOEtU04}W~7Z45`!_Ru_d zYExETZgJv(6pc$y8^rkmd1ySDAL3IlflA9W(vW;=@>Sn5{kg!v6+%+zluvb#hq2Zn z(t-K)?hesHf8+t^Q;WMeUYiHo3Jt<@0@`V&40oZrh{eH?EO8w|3v7@65ndUAF76Np zQ%A`;98xNx%%LfQg-J5890;xQly}WaY1MShR+haadV}eDH9>@1?LqIt*0+FYNB3Gy$!v*|!9ASph zj6HJjegS8y?;(lzKvvN?#$k!^10*GKs4oB5K_NpyGC`jb6W zB0K|U;>v4thzV|keW!!;m~l4@n&aAY7%eFRq_CM2f@u`T@Hz<_y++=qxsy(F#?Avb}RXo?W3LMOUE80X<{cPGuh zj*j|6zS^zr-lYl>$UXDfgiw#evU}Y0p_A}HKev*kWz7%Or&Z?GQiG}2ESP=H^E;}r znWY`{t(;vY+zGyVKC2~!l2*7|Px^(q8JXTkvUz{1ptZ8L0Hc^t9^voj9zWpFF+sX} zK$^ezoN(KRysjQ!T649~xnr{G;e$LA2jo@!o~aLBDUr{!G<^aJyvrXRNN^o=bru*F z?8qu$!kL0lXU;(TEe_I+_2304d$KjkYsoa?;!aNY%}zV=?jS8D-o2A)VeV{mZ(Vuk zdwgkgAtj}x7JC=n_9A>E72m;TvB-uGA{I$JT$!Xo2T|wo0^NXJu`+;}fu_UVB>Z*BvwI0Q>zzPU4J` zt$2L}ZF%K6h2@hi4v1yTx2;jmJ6`H8Ia%0I60Scx)Eb&0^C}@+#+?}Ypwjy0q+P3L z0lIa^b;jHDs`2Q|Qb7>MfF+PXPe`;@I2Dx^bkYQvry-06at0e^%r|wESqhKRcn8O_ z#Si>7H#j@2Wb8=DPjPxN>W2ThugG3bsDB&QVYhSO6zY6oM7#9yk|gJFe!%W|S(n}< z!|4m70S{FCWDw0f-MHyJyM_8h&9)S({yBXgyH2E!p2FKz5@W`We1-lPU!Bh-so*c~ zqIDMaG74G|G&HM{k1k`etvMl~=tem4yC0p^>vyv47BnNl%<>mvvtKz6DBrX3t$p;? zKEdQL)|!K9^hK3t@C}`!0S?25h!LfLs3I1`VPbb-e+e|8+sPGB`+Y z4Q9@C-?7Vx2r9=PwG{?+|)?Q7t=afVlM* zP=RTzM^?e@{n4Dq8O;IbDl_jkU8`>>-oYE+vLY}WL#Uv5wg&hym&uJzgdV9{7UlFr+l}udV zjJ?RMz28gqt9(S4-_qWOaLNTt&l3SzFB?Ohue0CtL~uc$Q4!9hhjF4%(E5s-Y=%h* z+=venWshN=b|(m&B3q1nE3Y|3gcEw4eJQ@4)I=ewZc7=49cj%^RWgg~n=p0(<-bqe zQhVV>WLm)p`xMVts6_S-HlCHW=jkcuAFVZ+>_sA`D-=F&y_-i&lc>acZSNd z@$rp`wPWSaRk|&V1f-N34D;9sOUF97K(`)Fu6Mw$irU>-J*rG{&$pAwg|u z5;if@hO?5Rocf-ZoBSpKYVroopeWL_OWu2>jJqx~V4BcSo%SF}C0&?>t|!OzoXyQ@ zF_M;kszvEQ(vmfo=*DYh6(kBP#w!_`?u4z4lo$`Gm66p#qpl!AO%0!1V{E+tsRZh| zAGoc3W@<*4W=$$|J3SZ}8P=2M6>$IMpnwY--gRb|#iI|JI>;4xnq@cE1fg?fG;`>B zrx_24JIXV=eRbs8>=&kz$mPl>(tnZ_pF+0-SPn8mXlRe7CyssldxiG98~FFfQ! zqV(uYihyO&G^(=SwueiEpXlBx9n0!;2(r-ckaaC9K9D-TLBW=Zs;CpF&WafiMU%j~ zGY^_Buflfp@!1&?9F?nrE7LZEH(`-i|s> zHGHU%|G1C++~L|%X?dRvz#aOH`I>qYdjB>B*iPgFfgxU1>!KW>rXYTL@WE zOUu)OnESH4#9QidH03%0AXFI=Z$GO!ifsc*qCfQ!?*S#w{Mo~2!Hxq}R8rG3v z+RZg`$#H!SCD|Jlhu3t51hbl_2;QoMa(a10wkH+OJ}36iiC5!(R@rl*CN}#NO5&hK z3_JfBZvE@ri1YW~jOJDzZxArnCmU|8%@M9|Ct+bW_N9&QS+mp~8relmMg)_8EKKcc z3leQ|WIs>XeI<@`@o7;}$4E;p270`kH5F#U|;c*;oWy zRMF%$$1mQ&DqZ0f?G+_z_~Q~n(|em-sM&mjHX*|j>EvZ)75mR&okE7CW=z`pAB`~O z$4kbjV_ORH8F+OWZkft#H@ltD;z=bSxK(*%@W1%rm?Z280L|xgY=NuH5Tv9b&U+bAkOe7Rel~m=L zQk-<_fXQ{DARL%nDl{VE4ATS=@IzslWzl<~0)lOUD^dnYA;^mehpd>)d-bl_`7PQ` zq*?uWS-rlWCNqdd`kTK``(`yA*RTG|qi0yr`H!n)Gs(%bOb`Ou2@i(zL1x4KvB`24 z`p)`FYjCp^#^GVWdqY7 z`vQ1^5g}mbN!2|Nb3m=meO{>(+=0!xBuhG1$tlC9;BNGMU`2RZlvj0d&lMJ*G-P!{n4c#7FeC(S&^E!r`UGITxmT%0} zCD7#@o1ooNSvTO}$>YBE?V1XO^lck*Nc*D-UETANZE_l`T!Y2o+T-iRz`x&4A`NTHqOL32-Q!#dYOBu<2j|fpZb5= zd-t%U^0sYwW_o6NpS#^X_he>jOf}V{si~=@qs)xc#!SgfO;M>3EfLHVZ7|?zy2~kd zW92S4jGB@n8X%xDNM%a7Lq$MTq|y`+r4%q1F6Lc5&-)(lGxs0w-`{t9-(Py*j|Hyv z+nm>Vo!50z7c2x}i!*e`=3>RFv&zs%K8>j`1WyA< z;S~2EO20I!kW$@uI0vFbKIfO4T2yxuu_`}?;f+s&U6h-XDw$3?$eQ!LmQR_pCf?la z2+meTlF*h@P}km{p{}!-k<%b^1iqN>^Pm0W8z>mGCq-jB7UsW_>)|2wap3M3{ z{0H4dt3OR3o#sxno%!Cw$R*d3$d9bk7wANTrN|=>UbE<^X@H$PfAl zt!`>~Z0o>HDY!o&Tze@!6BZiej4OdERunSS(H>Mxrj15ta@t?6D{ttEFxbs9xe*t) z*KJ)MHpQLRCx;{twl_@vk|q~D|86;$JCRHmIMODT{r5&F+fx+Soe4gaarK z6V&sTD_t3X*}Z=~!!c)Oh3qbdXdTMi?HT{&Ir5hwcgOr-*hhDJ|NFhJ{qMsA&Rp}8 zJFmjI7=lA}wy>u$WAsV|xBQW&RY*qy-{npgul_EUvfu$XSEyo%174&#*@NHm6%l_v z-OA}_O*oyw8N$IJpz;gYQ46sc^9CYh!w3kTZAol!-r7HNNly*b-^6 zHtcL}B;@p!Upt9lpP8!|xv{{>zly$mW$tNJe{GR;&TmWyy89A+p`9ifv{oeN*Qr=w znQ86maV>F@H&%E@=RF!t=z(?X&)H zrZU_7nwNN#Iu5EE=)6}L$<50xH+l9t>`jMe+Cy)Bcy;-KgC;+j3Hq&`gM9CrLRVFOvDN|r!Ydz}4hl4p-Y4W{sp*T-;@gZy9N zq#Oz-oj^~-$8eIO(HotYfB$Udc;v?KfljIYbqPCqjH!LuS>rH{I$|0&?@z8TfI{|i zlOgF^I)FE)r@AE?7JU)sBL#m5qYr7|AFe{p)atHu=;_KG(hx-Tj5IgYbsUM~{O|Lm z$fIpkhlg|rGhnrFSY@f4UlGPMlFk@tEL!aAidsTZmQB~dc2%S?!a}%nGAb@>8N$i| zAz!};?KG?+j@6}2P?;B|5TnrEUn}`7qoXLZ%tVAg)Eihrq$P2j@{r;cU+EJ5QV1Wm zDn32e^m|LlMXNhOjYegqUh0g?7mcf#ISNxgWSR&35Rw}UuXEJ={PzC5K}!zY-az`A0Y|M7}3K-!0$@mZGXz2M}o%I=PkS~zU*ya(+M;vAK;r7w? zu-LmA%fBK2hmEW~n|Qfba33g6Gp9D7*HqQj4bK-@`xqGf`3)4_umN7GDp&=)B6|Cc zsN7uiC4=&pcZ>2vRMc*RZx)7=2|p69S2fG%t1jw_Dh4JjFaI}eT`@Xb1h?-T&ZvWh zK3EkIb2F+UmVQOWH)9%oU3@J(nn3&#O$DrNA1ScF4Mwws1EHUz1`;7WxPoRDDnX-{ z3;$7GZP;dHV13HQc6Mm?933k>KG!igwj7h{>p<~0>p?F?^7ma@h1V?bBTE}Y7};{i z=`&^kr;^WB0=50j4`$L9*D}AMkKTjF2hOLT@Aq~8E;b$S^n$_IDV!P8MvmA9mM8~6 z7>%t;0DjV$;z(73y)GknUu|gF;xSNRlINug{>C8B>bdRUF@OsdP%v!^Cpj4{7S#JQ z*DDep`B;B$A`+Ap0WTgr;(z18*i6nJ5~bplXow+=SZRmXkg33ryDLKX@tc~rwJ*Yg z*W{-6MsEx<4X$P~HmJDy??i&66Nt(Gq{2 z`S9l_H6oFrDf3`5{k}dZhe88jGRjZiNeVH^hrpf7NKEzYLVLsQ%jZPO@F1H!o|Wa^ zR;AS4PzXT$NS1N4Yf5>a_j|p@+H8;QbR_$nl_}B9xZ>*oo=j^> zKg!=WOoDnE*1=m?*?Mh@8&_`jvUMJt47|N&zL-?WQX#O^1rVd^r%XUZ{m>YX9+&rU zl}LAKDr=~ca&vpDR z3X9bTmo?xiwBN+T@D-CnU}ag&Z}EBf7PxEoJ@-FEhncK#*Y1oeT;o`OkplHd3~_{E z4-Y+=&}Tw%3gB?Wm<_q#l)3-;$#RGT)9)qqpL*tnSHz;WviJ6FGV(36?>b>bC%9G( zCf6owp!^X0bz)xpkv89>4NaQ1jZJ+g8>r#hPgA$+jw&|dQ5*&UA0Sd6f{=9nVAMEL z;y!5#79)4^Zv@z8xVG8=m#RFO8q751=IQR@Z78BQioV&Jg?f`87NJ$)F5H!(~dJb+8iTH#VW zP-Bn6u(gG^<~5NIS+DPIpPNesPl^3A8I)6m{Nx(IC1}AQ@Ng)()I$y9u>~>pM`T^dAJaca!rCkQ+UBIl z1hM4)V^x}O?>MaI3Kcf-d^*7y&8U6K5gwD|$rE6#5xwE+Wbq&!v`UODWP6jPLyL_Y zlk47VPYuq@ak!jP2Cm~?`RtIE0&#H=3ASVIwRc$))QHnz$U|_{L~7Wk8jMFzdHx_R zCgqQ$3RDOq-;;9QA(bUQbufloXYHF)FCCR^n9%CzUdr3|&DaEnDQZ0CzRV0En+Bvd ztcO*M3B`ae2ap8DsBAp+tT}P*P98ESvcFoyEKv=_ir;z2ExA^eefce3A6G&2r`%t< z+aw)h?*}rf!kQ;QlN<%55W`gl?yfG!i9ui5pPvwGneALGxDLPBGpEtV9s5nYpo}~) zBO&D(ku2^sx!5sT17Gm)E7s8C2zKQ;nHMi_Q63rfbRDRh_G*G z1%4zsUUk&Zp?au%h(m$ z`>sJ!2_{#T&jWIw)#_hluno4h1&}C{@+!8?vGYN#3c~Qou@*~q!-W; zA<3sKVG$3f1$m;*PyROHZui=JE9cg!J|Y6_rpZVinT@&Fkrc7!PHBjGift0w$JoO(S#l&R|8DpGw9OBtiro zB;RKsucAKut`>esRDtY)Gx^6gZwn(d(EGSW%;rpgdVCIT2ji+a3>tgvo)+|>439Rw zro6dP4T(bN6qESy`e*(dgLjb&H*_kYo*p|2J{o(xh?|LfL!ejW$MA}ck4001GafQ8 zlRNA&SUo|s>-NnN8laQ+7YJ1`33G*nl2$O;yKgMjzh1kcuZys?)GPcQkqi%V$9sAn z!6#_kkQ{EZF)`$=wf*N0of2e@O!xN6SiEm5AtYBa9_tsw@wmQXW7Ar*r`NTquLfo> zCcqPgD>I?_t6d!xC%WKKrIbLSch#>`*;l(e^xT8zT8bjB@=Rq7lUiGRcx}-gE9mpO1Fq(^OIvE7=GS(heomqUsSeE%7%p zBAC6M8<}yI92O2%H_o2J*douPnHdmeCOn7s>&28|N{ZEgV#hQJwU(#^>{rV~rvC z+2NTTvWf3RW8+sAU9W&Xeo}~6QlQCl&^d=%rBwj4HNUkyZUzKdL8Hbuvx}} z?vqrXpPBfS!!-*}H!jP3Qg2e_{Di6!|Vyor+E|xq-sgo zIzAMSCCta>YdWN6f8$6}^g!v6`Sw|3lK4mRi@x&pygQ$M!6ODIAezP*2BE*HaommV z>k?timt6r)8B7C#MY zyb+E+7Rq}RS>y^}blr80*3-;E!1W3htJMVK!^4_+?g<}G)K?b~387H(uWDrb05t*` zA69yQDuV2;z~H+#WwQ2(@DZml*M)IVoQV`(j3YrJeiF~2JkbFRTj%KY*|@Ucc1E~H zhJ;-_r1beZJMeovHoamr@~eXT zkr~xu#P)7EV4I;*OD$iGVDhLVK>RuozV)oY*TgA4HyyeFrrO2_!QKhg_~YLz z3=b9^!V!_rw57g|J7?eK_&gGCObBA{do4$+vTkd+1G!vX4oU-$f5GKOXrjeKQe4M_ z(z&3g0I#ep7+K%d%V{yJZ8mO;SHg(V(2CLHNXc-TX-BiaDlE*eN%!nV1!JK3Ckfg_#d z(%qaJveH&Nk^6g`*gI!7Jq9Y9>rK=XqDa7H%%;WNh;^*1c}7V`U3lQ4UFZjd#Snu| zk14x7;>yGh)OAne=(}9(UMcuw9oK!`j*?Q?B};KZZds5F1q3#Fot|qem8Q+SK0KOC z-@9?3v74WAJ{?Ee2fB=mqaO9T&54a}DPWm*LM;e;6yBKdHZ5BBU@@t=UIu`^&pN0j zpI6>A5Y{KhUXIZctr?~E`$zhZwg=sWnV=J6#X{T(meJAfkaIIa)p2WfTwUJ`~pK7fccjT{Ok4q*EbB0kRnzC(9KQ3{jMMP$j{nhd+dhqq;lQzFwR5+WP&GlXSwNjmlmMmb17K=nVHS`_kpS zrI1&Juz-oQ(BW@b!r8qDs8|MK>sxhtaOz*Lcks|&Gffx9oTEqpm<2|$CPrIA~3Qu%d*Y>dskE;GWp#3FzEI?MKU9`f&|zum)gi+&&<;7 zqB%UAy>wJ&7d>%KpT3uGP;6$8K4_dQMI1{wUMo1=PVe4YIN4_>n~-rTZ#ZEX&&DQh z@l@I*OG@%09}fE$%%7)=nlTsD&fo0h3 z6H)LZctAjX|7&R^2-`*Tp{-8>zV*1HH4xL$8<6Nhwzbje{`j34R$qb++`y4N9H^Jr zP}8r{9sxXQ*rrRG6~6x^f=Px1issF1C)EPj<&pRL*Y22IJ8F~Ol8{Z~kG;c#Mtx&@ zljz%f-Bgt^f#owy{R^^Bd($ksO;u|ki&j-^o$6Il2MpD*+MvM0YI4c3!5h4YRRe@p zkwcOpN*wQW{}mEArkn$z01ab?&t?12+H?NKWNO57`0nReh&ngOiyq8<+E}YkK8iDY zdd2IJP_X>ZaK{&FBS^)?oCJ%VSI1`8xFg-jQZ47tPauqZP&M|^Bc_?6r@s%l4TU?~ z0_;^$PUO#vV}6;Lic9OOq~)UB)ao|(H6_NPfR11!REt(l98peIMEBv=*l4y z+IB+)d{-Tg{negsE`Pw?fnE!2CF`ywzQ=>uM^m9AE=E^KCIFBtJ>QnvZx^@V>Gk;> z%urd}x%f-*UJBA4wh=Z{VTKYR7QPMw1>8Qn(DE#1Ct2h^hvQ0cywl4O zIFfZk2Y+i|wEUo9*;SWG>d%a>$+_IDJ#!(A?|r{Q)lzzY)r9L}H5Nsn?WK0&qw-mK zz8ZNOm{l)8$A0YT{P5mRZKMuU0{(PDH|=oepbmA-CsU zZ8l+0XNkF<)5_%IguLg?yIdT!|AF7=8QXi2x4W;cQeYAqpe6za%8#73>|xdIOg!D$ z>?Iy6`)xUT|ABNx==K@u4J>Y%TpM$!vX~Aj4yuL!$o(0#r+JY*NsU@hVyTrv!nW%K zwq34>6*DOZfs|4~zRL3DI%`K-NG6`6M7j@AS?pbFoSyym16r`x{WCtEHw|-6$=D5Jl&|WOaN7>e0jEcSB>06;tRGvez^2a2I(T_!V`Wl*w)#uI3 z_w+8lv8g5(aSDP0W<;|FxH?`GmzL=_)ZSF*CoMjTE4W@-TcW}k9*9RM4>EKB2?6MZ z%T^yAbpkZqK36j2RA#&`DN~d0nweO1^2Q!q$s2vx%GvE@Wbqw6Q>j*&%7o?5!3|`g z`ty;+=I%Kgy(oi*X-O+jiTmuVn|tbI74H0NDZr6uQX?MqIv6SC4G_LNO0{*Qp)t1f zjPT9GqUZ^i$Cx`vT$c%z%>J}394JzfI`V>pMs<)Cj|8ww{vOf)^rcoIi+hv6|7zD) z|ETlP+58UNAFoKw#m771>&ASqVG{+FR9dp;Teh^`@qNUnf}QE}ZzlU279iYmE8R+l zjP=_s=fRvz)8q$STSsP_jWv8X#|Pj09z-BkXj9+=aSN%zrX=ejt6X<2r|gRTz1$-f z$nhyA_hm*m`IqiVrR=0z=i#~o4Hix|RnEw>BO=NU$zXDr1etNLYRRoxN_l2Jr|~Hr~T+d;nE+wQao` zK{=fF&)1Thg~;rTv(LH3nAXUMV8Qd8@v@4$A}`0o=HY&y#2z9hF)U2 z|H<~U%i!Miv8B1FTFo>x%c``1@HGiO)L^r6_UyCb^REf?H+?ne_bG0ULOe!=e<=d7 zUu~~@GoB1S61}LYzW^Lk#j_2i*1O3Lul5=ciakqy>;a!tMHZ$Ab$fVWv!{kSW<8$M zlZfl6bjQ^|s#mfc@Ln)r>sq3l88CEr#@Jj9%&8Rp?{6k@OBjy_z3)ZqmWRh}Lz(tG zz}g^|nuw^z#szA`NjmLK=>37}EBm@NBhiUZ`W5^-g{eI#^PQKDy+d#GqFjecj2Nio z0M2ssQ|Y%ac;Cdk0RTCK5Pru-f~f9oC$+TYKS$G3lc8{6wvi2Pdf40*y=|4Ia~2)b z5(u%>SR684AUjZW=3pRALYW>!fBW4O3Y`>2HddgFZzQsX+Ah)Qogg z=8iZq%#)*J*KYDIE^|IvO)V|}DWL{x3GY2|V59E_T0&?mH;}k*U5OP z6|2gVO?QM3svGJRQTpXu_s}?FXf=V&* zr#llnU4JY5^+oa!n{t9yXXik~DfYTcYfB7v*)eCIH}pi7sF=lIw(f(#%K*FBo)2Yf z;hK4E>E`j2%kLMx%bd0FL~c&c;+0FHv1PC#r@KSvt%zTf6z>=4jImurWz3=Kcsj+| zj!Kv!5t1B}j!u~32@LtDToIt*7Hx4~`QvDt^6P1~)m@Oo-nHr^rv!A&Q5|s_&oR)u z=D)PEn#8H)sy8~ZN0fn0@tpQY4`i` z>NlS!#E0QyozXh{9)u#0smhsi?rGK)8aHuBWt(*Or@|*H%fPQ34L`>+M%zo;>|xe> z{&=9(VvMBbi|Jp)kp-FVi+c_n8*FDl@!wMtJmllXUZsJbKUQI!TC=So`LnvPc>9>xqus(B2zKeaxo)sU_+|zDGKG z6Zf+q9g;Io4-woChr)f&is!b@*K8|y47z&w2YJZ%sTZ5(5D3D3K?k&n*F7QILn20KOAy*f~cJF8fTcSbT=E#f}gvni>ror2L0y(I38_(H^+yfwpnn~y&Je+|ac z{wK!jQ>SwmN{8{!D530z(FrdVX4ZFf0h{ZrO-@}Bz6?e){iGU-u2^FkXvqr?1F^Qd zd1qa5+Tdpm+}1m)SZCO&!y8HNtNM9VizHq@OMZG2>TV_{alI*LG$mWNj&7EW#DwoY zS5S|!=t;H;MKOGnx?sqQWFhA z)5pFo2{8@NHDGAnxpU}qp@1JrKFNGtZ3;jrC1-aIb zTCZJaFMrpI2pCOsL`yT~4yN_80LrQK-A`Ld0T5Iw(V4enA`g2J)+b1B^NmFYvl|w? zLgkSkv|l={(bY9oo@Kl=)Ob+sO`Luy|0Cy14Yt@r4m-s^G+!{f9dF26!B| z_wWAgF&)kG)&zX5b|~IO1CRqfC1f$@jQDZdgv%_rjiiVE`(m}P%P{e7&8{!o4o*XY znw+JaDa?9d-Gq!Kay1Y;btK0x7bsN(DUPY98-)EpW!Y$>N~$%gSj-r+``t-Ft>@aTi(!_C5VrovJeXf_0x?4pF_1_cyxzkUj7+deWNt158% z?5ND3%PZ0O)!eRx$G&`d5u`%3I`Oeb{cXXG-9ThX28rq*d{c&m(Z$Z*?!aEF6z zuMTPL*yv7E46zrO0+d@{xTl@((TKvp{o073dm)AfZgz^_cir|&Q?C)3vL`cfXgeF}}k$MiqstHNv!$2dwm#KUjM1KOMf8j!ejaKBh> zB5Z5VX0kydmH@4Xz41RN4f`{+NH98`zw?g_J!lo#CS2aFxiD+EMlPQ$PhsnS56ALk z8b!Y60yVa;d4wB-4=p#lq1XnQ;sWZ-5ZGz@#y-##xTNkU6#tDEe;(UDPH$5Us*QGH zlta!kcsGYAd?4yk8z{a+q2${h(bI-MdVQm7+WWHBS|5x=R}eUZbMOFDR1$mmIh5Eb z>&ApNrWOoM_I*l-30^iR`A)nwuBJ#1A0EXVh1Y`a-}bMH<;;{TlqZgmXf$gr_yxr> zwFFr|Ioivh4rPc@o)oou65_aayUX2V6udm6c#OARu;wPYE#s_LNXn8c^mGMJtCA1E`NP6 z@A#)$;TbqItJ{(yZmbzu!e;~%HawIT{HA4)GS)d}+J?!4?}&^x?r=AH9@ETuDl!xi$+fP4is!3K~S_b@@)xvU1#)$J4_XAwuY{ilBi?pryr#*f>zKEd7 ziKAxaoDVUi&-d%;+zsF5biPfSfhB00Hd?#p+fY>V)lz7}9zNF^4?_-dyPi-|_h?^QS zy~cdDL1c?pj*65lI>i;SYh%uh`?IeJUzGO*ZQ1hb?PqJQV~QdG+7g#NjLBR5^Ak2y z178(Xbo`$8%P)!7I+sIZ*S$5~dJ`|tJy*|QN|{yigRxWCnrvpv8CB>~jf%Ir z=}}#(-=yvYGn>9CCx_ZkN@A#n7^5*76h4%+?h;!gId+P^(sOTAmqj>v?fMO>CgO;( zO?AF!NKAI5Cy}TbZ7rj>^O3Ie9b@lOJ6ZMu)g#O$+F;xTa8syM2sv%V#UU+L?n+UY zi|pua`G{w2h;DYBHX&G~ZS$IrxL0ueh35ejVSN!-&h0zl^@eTpQJsVcRs|ZU7tIlK z0fZ)IxLiH8&!sk5UdXMO0d1& zSgjI$x&EadnL!i$fR zMgbLCUPTu?`);IkYcKFddl{mwhkanUOkdmRU|5sfeXvFmCY1sod!kktok?|K^Gzz0 zVLVJR_fhQz*+1`it-bTD>4!n#bTIV#%}Y>Uhop$2j1%cc;enkZ{#swIhasH zsb^(vtO=4ZAnLErdTV@FCroziJP;DL{iWnDa*Bw*j)c_$%SOvxR)7rL~ z$$&ciAS>`kJR(-#a@d-0S8`eh_FX@8_vo`9zPHVMem5YF1^-iGJaac-_r7oL2AqIQ lcTYoRzV{#gf9?f12qJaZmRRTNZW0012TNKIps4t5ZE!3h8WZhnX&fTOJ= z(A5(HG=o4KY%R=OZNVTecaS9~*v!S&g%b<`f-J!nZjL~ZE2j&@8E9tdVgm%aYW{~z z;rT6<6chm9=J!J;(AA97!_h%p3h{@|9q8{t0WlQoI#>LR1yW5IRafoT`ffas+;IvsYQP@ z^s~gn!4_mM!C>R+3K8YvdiLxY=QBP|u(LH6kBEo}*N<9;Kbo?%_>&Ie=Iro;%F==h z=m5Owy$cr)ClA*z+8Yi3tx`9%e^m(#2LIX6O&@-C@kevK+}!+JKc9cKWbJHe>F_80 zUpj!G<>RvEvNUrw<8ZeHK4WB{`(qscGT^)nlD|gxMh!_!I&n)2Q3MZAl9!u@mxG&! zgIiFCms^ydUsOPllaE)N>sP(_550kwwyucT;;?jc{;@VBHFbEnl?8;<_yr${bNxNZ ze{x!QS~vh*Bzc7Xi~NuBpTyQc5D?J-*je(St+_K$KS#cI3G$>t^d<$-&Q!(ENusza{;Y{O6)_aYb~%#nsk=?gyQ#nYjay!vgFE za+P44OaNf{FyInr{re zQ0i2ne~lUNO%<{m>?HQOcX>bGbG59XZH2K^NS9>Tx9A1WQ5LfUJ_VnC!oZ;eYwc(+ zsbZtEnj#zL<%f&Yw!+|m6=(IkN3yf295kW1#`X_@bK&29l-1pP-p85}IX@dN0?z^enK^ELEJ3HP&9;h~bSx zkp6kInNPGZ+=!5k<$z>8kw$b;80zSUd}6Ay7qq-`M}Cw1cthDl)f=zdSanRDx^yF) zs%73gi}K-v??rdSYNlh*B0P<6x%9{2%A9u`>T5Ax^*?h%E_3Sm&?Miti4GEF&vPn! zFeBG)6p^PFKLuZp9TmSg6l09aQ|qEnV3bhcF7~D?o^k4Tlpa~_A~MM6IFlc#i#epJ z@S0yktr0EuNDl*xR(xmi>ZbmN)3)6sO=?{%CNJ*3_xjZ9MMVQ6hmL8U$jV9j0tAtN{r)AYdO^4okdY9mEeUk<>Epu)D)iPW{ z!V>ob`T%C+;+Jja+UAs^kMpjgG+GahPaR2op}dXv>sRrV7Q@3(N>1xhOu!e#Z;3v& z#G|_?a)k0dNZ*A6Z@mm|JtRR*cvC{Egy$3W8F$8N{3PM6meK%L_7=N;|CXAf@;s~l z7r+ry@tLp3?P~pGE%LjM&k9ve@G(-mD1#Uz2VV>xjY>UQ%^&VstXa}M{B)df_Vo3L z!YplfgkDvS#*=GF)I+)R0@l z05AVtQ~{&}M`6fdh|HwNQ}Jh+xq&3)ws}A^{O33%cWMEIog_BnG5);LcOp24yb3O5 zpVZ+fvH=+Tx4FtlP$v4H->!4?=fhRwL0&-Gs4XDV0~HjSN!MIzfi6}FH95zmy@nOD z!Pkv5p(@@>UU9E{3@KU@9ttV83O1qCDt*^ZFY|8MeY(8us?6pHW_Fj+m0w1RDmyL+ELfc0cP+N`R3ebw?z!eo7HbX1H+ zYv&#t{pj8+1E=>d_vVK_tkTgmnbt3dJe8#aeF2>%tzaBy^YuTgSmceJic*R5=6$KK zlu#Q!9)7*sVrfx4uX@29d*8<{Ljc@2Sd;2&Wv>2VOl_Cr?Sjp)_|?ilTU53=uamWe zzbA!Cd~4nbnhRzCo!9mw)iax(PuUtDOx&v--!g7@Lp!eQzn*`?puuBi*;7nd^C#SA zqJ9}uj_Yf6Zu1mj8P1wlfDPk^xKdS=UO>x(X^ zi1e!S>MnH0Z{9us9-yKun|!w#z&!5RIl2+LnaD1^hWsV#)&oFWrHFt4&8uqu-qqW+ z{!FKHa2T`r8yQ)GC@w?wNl@CSF*wqT`(#D4+mZ&^Bhj?iyGYUSj?iVKqe1lc?megO zlRmzuV!6ww(=YWN%)4MSXD#!D(MeceiKv^_zjxzIljF)w(n zFdkX^O{QV_{Rbm4I@4l9gZQP)&SCiD$~_{SBA)MgN*Ja#sxM&pZP8>!EEZopVSE{V zllvg5S1Ryb@sd~5#uytVo%dKU%C-Gx{ppF*2BHStMZ3xfETwfNwe(0?)U(l)I(cAIHh_2_RfD`~Gg}jC|pBUY0CqBe}ZR@mTb9TYL4iux%NYM>%Ky zs;~`;f5z78RDs3+w0CufkTezJwFyNmAb?Z{B6hl|Yeq>dcv-T}Rdq$IXlhKp$>s1i zi5I^lmOdcpbL^2ADpS%25^jsbFNx(##g=c%nAy`sTc?2o7#IO*3N^yhxEYGo1W))- zmuDTji%Ql5N55be5tDs_*xoBFdpXw(LnXYch%EaST~A)b#z+L>%sD)hYNB$GGm@%_ zP90J8WQrFz<16Q6@TX}trK$4Pz0ddi6*RtmJp%$M&(g)sMFd z$2&EuuJuW{=3H#FF(yP6zVDM_NE)VjQs2m_Px9#pL?m;u&Rbh*||@Gvn9NGRQGAnG8kdwdVLo^zfL$StbaF2>#V`QT|-Wv!FL zb{fM7>8MPnhZ6Rw-bn9@-i=ut1L%fm;S8y{)%RwyOzz0}k+K4xfd|!IvY+vDtSx-5 zr0F~=Xy`_DX0lei$LF(7sBf9?LMBk)huIE*IPnt9WxabwC7bS{_k!2;?xjv1ovEwL zdFf(|Iv$?`Z8!BpQ^lB7)-zehH{8LG)PZ4mxbZQF*h1cLb=Ww;y&wslos9u`RQm^cj}?jgw_C|HJJKg12&q9!U0&M=mE=50(RNTbWS;( zoG=G0JDvTM`;TgyS%OK`$zMp@e5s^RF{7x#8i{IIJgN^|q6v&iAgnhv7LkTjNsu2F z5~li3r- zYhD^kNQ&mI0K&u8r=rH7n`aE8g9zjx_q={y0E{pgwLRs{HzXa7# zf%7A0h5Ka2wknE zZKl77ZZAd^RVaNV(a)1*aIc?bYWBP-P|4O%l#=sR@v&<4h@3^H}~j;pne_%<>J7UR89DG@lo!y z!>v2K#mH{%q4t@`hliojscDhTx*oM!Ce`Yzv}E7y(-4gNU;&8kI&BlFdQyLGS+S;B z@5E{)jC5ycw3PJNPRMO^wDjmCW8xEV!cFhFObhc`U96EMqpp`92%5IQ@J4v`%*e#L zrfjUfI~f8^TZ+3+Fx;$bZCw)r8HO7O^60-lyj^$bmQWZ7dvx+}V7?s%H+>W@;T~$h zb9H)4TB*fTgYl-9Mn!G=7BWHR@)Sr#ZEh5e>{{$isrVJ@z7sa!*zeWZURUyi3M^E774Ph(7=D!lp>viW-oHi#OxfvCYsN*6e zq=6rM)EQT;KPCqU2a`Wy#5oGvphfOv48JrH9n1l_<4`V^kQDFrOlT!XJvwi@M#}}JaHz{JHtqMx6hP~V~ z@}81R`(TqCqe+CU$3K{mMEe5q(2PPZD83=}`BfHpRQW*7l*lqqi~iPZaqPFr48ega zR*JpxkFhI=JXWPNYn|L#nA0>?+L!7nYV#o{Jyf^ zuhwH-Qo*f(&C*9REvEOC>4*nqH96r2svM~_F?o8ZhSpIv&%FlW5CMSfFp_ZIKn zzL~-8ajv5EWExY`?N|6;8jcU@j#bz39Uyv?vPVP=HK*ymLMHgg9!-&s%$oG4h({?u zGb+h+e)qT1A&YC?XU3PeDELm&)1W}k#T>oMP`dyuWLj?DKKh;XPxTGWU8O>Vu7?=} z>MRXhO?&wQQ>aF~vCi%#Mb|-E_$-Y&`%%_tZk&r7PoG@-hI|X)P36CtOzY!`vnmGO zI)LqdMJ6GIvsFov9~%Q>wkM^0B$i0Y=tvV5eYG?XBjoFcx6L7`qxS2w0r(ExkXQUL z+2GV6dn#c&YN_dH0$WmS5`W zF3ZjkuD$6H>Fa*+uBS8slWH$lb5?%l^x|p#*N@@VLn|>=!Dmd)eapw=bwLR5e=_E= zI4OU1T0hRG%Op2Lf#8){wlsaw*@Shhwp(h=ec$^P$YdsRjcP1X_7jv?Ugfl0BDfu_ z^=(1rP+f#pM=jD|rVmluCp#bcIP^n}(skYaK|jx~e6VR3M))!g;igmf7XVcU(nYg0 zAOj`W?^5!PxpS&GH~xJt-G|;D?xG!w5O-6$RAXieUp9{~NXyOA%`AGm@eL$_@e7~) z{XOt+MF}6(_!G$|f8Q7!e9NTdh=QW^Mw&wnS+e^c1l%Sn^t1p-*J`*jNo(E#Zc|*U zwluxV>2z?PIvtmDe3zEo=_2i%obN;zjPEDfY}w>z+PZB5$UXgVY8i$Dg!|dF?)F)g zYM@@7N76BgUCA*<`Gt&SnBH#lwwXbBJZ6`r0@Rz zV0=8B3K8D^Te}3elzJr^Wz|Rlh2qDkjyO%4{8%(de|G` zo5XE-Y$_+|svu_RHrGvCpK@n!>B!=2eQO1*|FsKOFmqCS*UtBr?PtP(`>65*<9DJZ zdmn&YHrKqXpJlCVbze>lCk*OyiRw_g2zJIzYQx?2ogcvfI>9qn=f{5h5e^lJ&2M?x zieaNroz1GkpwZ=$D)>SrEvNPID`~N%j~apc8W<&1!r`7n`t>!XnYU$1%Qi!i$Z)8e>w~ATU z*Von$4S;D-thqsr(0hb5L$irpv#!{^kIEzEOz7(bp5>P?6;Ie@O*$J@*3920hiz~v z(=}nzxOT5Gx>Nd&a3^9nH$Mp`6nlz$eyj@OGqY&4z5FZTEF za2~y_4c#oDIJnc1F4zBUgVo&w$MuBuMcUbBSjtvlE&|6 z337n$BBAxI&mwQY#*dkOsQIq;7p@Vk>2_v*CFsD{4GQwGxOkIAxh zV@!?VLt+==X98RW$&K#Dw0}l^Rn4t9Pf6Pv+#GXpt9Q~n@mcnG18iXPV(e98#yokE zJJ@}>QAn!s*y?*%Uxt)5AmUrskPyHQ=KzU66E7193cy)Gv5}^gMmYme_M`PbmwbNv z-&SEC?6#4aY;0|Da&m@XSx3hxq0`$N0|p!T}MVoX(hb)g@mdQsjQ4wO6vN2yUFkR^0?{pX!6-Cbouf& zq3rz0dP&m?k_t1elyAMqE(00wYe7FV=1&Tx_4N+9gQUuy=Y+D0^^85y~O(pzq+~_8q%qo z&Xt0}V5@FsW-{u+&`#65?{wjs91Mi93uK%|nw$?G)5$?0%gq-VI?%>%?0E+C;Sr*t ztlFK&tAj8h(9}+noAW~h;=zOZ_*}cg@p5Y)qp!ADmYH}X{--IY2}P&htH84~hg^0* z4dA7WKQ|znKqqHbHHd6hFE42LdbW3Y%rRe9Zw<%MU@n=S%vQyTY z)L8Ullptoj$yHZjajlwuc8Yuuf*u>{00z5|DA}&fe^`tTUVC_DSaGI|pZ;ZUuk5%E zC&+?6X)c6mw8X@3ZxLfXFg-;K#fl(#8U;h;z3-$PG^nr`d_2eRmu1wGGHlD!9NYPM zgKJ;rbZ<9fKy+xBg#)z^wHq!}NFm8U5V|*HMPQ)y_FbF6Z5DXdt6_h1nM+mEvP(RC z%AY%iaWwQ{*t=f!R04mp>-gE$^Shj;aqEHn^es#Hz|Hv#Lp?h0{N>)XSNUIZT_)BK zyM-`>-cn;vCZ?s`p-JuRaNyTeFv$+ zeVKGP9wZ7QQY*$g+i8Vj4K!9i4ox8GD1Vg?Wl2lf0DTU4v3Q2QDJyyg`|haht(D5o ziQ!A+svfAVbWKd_34MP3W1sV=oC&`f$hA$rdmW#xc2Ak8*A_M8YISaoK9XB*rG@9J zf?V=+Im7R1qfhcv&%8L20Dg^i^Q1$w{>Ba^at1v3$)NekVkjOh=hJ%S66YwA9M2bI zE$=Z^gz4#Ne9u(=E1l2xudmL*53bMF zOWseIPd+n5@Zu@?HsJ($U)Z|y`^3dI-lBTnncOVqcAy~xO}cxH(u#&KNVW$^_V(K3 zYYX4LnSwx^@-#CGSoiI%j^z1oI9PhyLSd;>oXvqoy9;MgyRyYp=?-)}qI)()@pV?9c=h0WBusd6ew zn^`(TFD~}`E-3TNOXf33xk7o(o$oes_n+ZzUFBDB<)+y^je7pMV~Dx2->_i7s7;Gg zs;JI>l(dx$8Rrju+(yy9Tf***DwT|SpX`{`O&8ByY=qAstq{ko2e$5h`-I{yBl~SW zV{g~0T*Zz#B`3E|RK{B{71tqXN*6!U|GMDLJPV=kONb*hVR&eorIW*gBUATi-$%!;`9MKP7 z#e>-o?gVHJbx7fq9-!wbPhaB2kRn$8kTLC!#$epK+*$a5;_Dra`@u%E2S^8A4T)SP zw>uZ)&kF|uN<)mFgZ)xo$ei!34HvTM7o+~DNE{*E(Rjqu53hT+{aGO>dM+cyJ0dU$ z`=GS4k_7aU6Mo3y+3V}>8trrfv!&>r#Y;r!nL^=mu!4G=mU*In`PCUL*CHg%-yE?C+cS)&a^mpM@@V`Xi2GiQ8Ku9T*}ptL zP6AS-7|~KuQHc*>S2QUdo(yiRyvQ@~YeUnaC+IjVt**8inVH!~C-9qCbBw&!0UoVMt?wLN`s-;r0Ht$3(*QAzgu!s2|OcV3xjwI4T%mhRtgukIQezg zNME&|L7Qn+Rg3YCsPe3(IlNM7XfH}t=to0^aq5HK9*Y;i$*gwZggn%hhd^FOS9~=@YH0yzxcp!$?GB!VAh% zi_DOr>1%+k|4+Yt`z-U*=Gq!74*q;AWi5H8MN-a=ZUbLG{EZNJjC$d*TwGU!_p#4v zi<2MSCG|ckA7B7eF{oq>v1#Nn-^Z=4uDaK4+AHXgT_23ObQ5(07#H9 zpm=VBAoqfeT(Ni&e)0clk+e*pkVTexjY0Esn4T#9JH`8Arp~DrU%JD1w~DhK5fV*G zRepU6iI93N4;zeq`+|CEYHE=mEz6vwOnB@n|MgM8OTSL7Rae8RNn;a}s)N`=rJ^TK zo{T%06*P14oY8LW!gSaks;N~@ZlXWCWfb-nVZ$EHe|@JK_nkCnEDAzrmn3#e@S~sM zLw)#wR3$HvAZfpRAh-2KOJ#NFC7veQPka;^y9<-i|BOfMhgolN4&zPiU4SpFWRxi| zQ3-bJ_VlRH&>VY7jDTQ+1|}xUr&kE`&Bn&IzrX*k&^+Kp{0XeJw-1dkRGi9Wl50{rvp2y|akweqd##h6+uDTC33F@w8X5G#dIXO6by1P$0 zTLz>g#KqYquG})-Z>Pt~x0)`^x{;BREx4YSl2`>% z5>^=FhJ%WEV@Kq-3ZIl`DR_K)H<1b;fd0 zAxLA6R)|=VTu=~@S(GFSQX_zx62gTKi~L`WT0 zH_B;V4^2fF^YSj+F}i=iB zxULvom+(3HFb(oPkdi&OIIzwh=!jscG?=|;HVhdqy?jIn4@ATB*-Y(0J%kIVgo7XF z4(*9N?)o75(eHr(d}D(he*e5c%DkP-%cTA=;!#=C*~A3plOdi_t^?j{JqMomz!j_~ zvVO7$q9hN59(A z(oZew(dXVLdm5@G!NLLN$5NzZWDTK^kbMmq8wY3yn3^WL!{-#1WP2xrvZqgw=!Hh- z=x3=&l$$kv{pSJiqhF_t_s~m+O2avKRSE%*k5Mgm)uJ{t9#qqCnXTNzBfB0F2dTH9 z*&=52NUF8^0AXb9XsUAO0)r4;$vq29c>}6iXN%_fzWp+EeVwM+BfbPYZo|Jd+qBL0 zgB!6kOQ--AkGQVmqr3QhP-*U?U9t54fkF|d%}66!LYK~v$2|)gG7p`h9ZA8Gg1b^% z({*H0R|k{eCXQ*chSBv>JB%3_C?fO>2n722(v+VB@;aEfySrO{8Ti9Rk?0^Gsa_#) zYyA}kLH_yq`2p@UC~@n>GtJrQ>7`(4?w3-`HIggmY9{b^@7^URQyA*+b2-lyXJD3x%>c>ODu z?h%^#69*`?LHPRPu-(9iWWtT4x1<>Uo6*4?*_~I?I&2>}Nax#|OUJGrhk?yrU;00M z67eL)Tuc^B?x+!0t{5(raHtJON-ec1iWrAp z4wq&E4LdI%HR&8^AhNQ5aU_U$2q$=?1jssO?M|17mmL5V1$FsiS<`_348pvr`ITr9 z896Y>%GUaiuss)EE?Y-4YoH64tgWk~8N`L_pP4EDh8Y5exIqwMkZ%7+K36c<0b&LM zI{Y8`Zi4mPT+Gd!{}(>$zththZ0!tm`TuaB{(#L@%MI6t})+;i+id?M3S+e0Pr_99d=aUNqv~ zL$@hM?!n?(tzI0dtsTn8HW8P(WP0n0#yY9R)`U3JV=4A1T`h;$A9x?!~w+tc?Hq&n}hQi)0v22x(D`Ht2)QHye9dW{gQUsd*s_k_wHTa;Zq+2R()!l8qby;| zijxmcRoV&mK}YA8=6*G%;tHSaDrF7rP@>q2-+Sb0IRz;z#`F0HC_Kj&yieE{sbMxr zPojIJeBxmDp*8S*LMr<6W_MlVUcRA`)uB<&G-KmB*MRRfFHbi_2fu;xjoSBBmv}+z z-yehS?|HwRd9Hcwv45tcFP^ckY9^+mkeX0lWsp627QsVRpq+z}%5;5@FRfh!4jjU?^IFPrergeT z9$n7jgb5@*MbG$OS6Ve}tuu8d-L39S0fE_t=vN=?F~k9j{WB8kaxiG$V|W^7 z#x|I%Yo(-3Iy0PBZQGG1KC*bRRVNWMD85v&V?(ck>BXa#ACz-zVjxV-p0PkU^mJGF zJL`_V--#8iSb|KnZcE}KNiwGSV}a!szOV7+1w)MQKSsUx)a7_EKG^L=VcgG0M`?Z=KpgTr%ObnS8Z4hke4who5Fa$nC9Iz1gN9nFR=?A7}A z5r;McQ^?p@ofH`@Gy)45n5duPgndF!81O(YgO#R8JKY;c&0MSugrB-DamxV@`d==58q7+&p~LtBL)ZUd5qFZ!yvZSSci?MmYyOHS?Io} z`-m_3VLeQzbhqX(!+!9Ntj-RJN!D+7(5*ix-6B1JnK7KumCO@myI7K!Wq3UaY%Rop zN1Lci2%YG5Pb_)eZl+ATwNB?={)5x>GT7bd2>2RG`qI3e?q_%1eF&$|<#7BnBfp>( zu8VIYHghY1Dbz2<_#<9+=+7pklOlhQi^paKei+`)jK9hbk}w{%*#kMCija;32}hcH zX&HzLu~%w*?s#n&N;|Wv;n4NHYK%}jy9I%n#D+{9^g3xU8ioq_Q|6vyl0%~dj|^Qb z8k!h&2w|SuPNOd7?t@@R9;W|iArpexY z%KQ1<6ESC}ZO_A^V7+mYauVCzRk2?PaBs_D?HweQq}Y5oxMSN#c3(YMe(Nqa>mz^0FySV0Lx1OlfDO7wY(ol zCw1Kh)>A{h-uJcK6O&$l*drI9m=s@M9s;*>Yt`!|U92q2iT_mL3ivjAmkVyZ+o&Fb z7pW;b4Gf-ZwR6}Pd;$=3u7%!ZLE0B)@e(eL>=>M!?pqI7mASV8Cfdfk=acD_PMjep z0-S|8zqt@FUp|XlcFU~f9SH~}Xn*hU<<##E)P#psxU^$Fr-Ah14Gi9!fri(0AhZS- zn)XG$8Ca@!tuIKC0Dw8fXEBT#@qi+zdp+OZ?6CT(B?OX4kCLK*?;5L ze{uan0Dq0~yb16BorqEYGuZ#XIsbZXcM}8pJFy_3#9type=+{kt=@0O7zA?pr#rs? zmhzhm0Jwp)ztcF&|3q;A1K|GWi2r5=0B#`e??lS_KZX4j@cvsl>VG5WuK@Vp$_e=! zIe!Jj|19SQ68}z(e;6XQZ#ey*s{PeoV*b_(k=sQ``3Dd; g*7SE`=luuUs;PPlVVDs&+lYUHh`k!jck}fB0Co0QzyJUM diff --git a/doku/bellatrix-steuercodes.ods b/doku/bellatrix-steuercodes.ods deleted file mode 100644 index 7ba7eeb2ea5755f7a6e9b29f462b6c45d45fe2c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10833 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 b#P|=sRa*@c>6ifkBIKVCa;;)Aqn`dB5&8ZE diff --git a/doku/TriOS - Logo 2.jpg b/doku/trios-logo.jpg similarity index 100% rename from doku/TriOS - Logo 2.jpg rename to doku/trios-logo.jpg diff --git a/logbuch.txt b/doku/x-logbuch.txt similarity index 91% rename from logbuch.txt rename to doku/x-logbuch.txt index 25556a8..ac39ea1 100644 --- a/logbuch.txt +++ b/doku/x-logbuch.txt @@ -1,3 +1,49 @@ +r57 + +admflash +- plexbusroutinen eingefgt +- sd_del - heartbeat-sound angepasst + +belflash +- per compilerflag whlbare monitorsettings eingefgt (57/60hz) + +basic.mod (propforth) +- bei der installation von trios mit forth muss basic.mod nur noch eingefgt werden, damit wird automatisch geflasht und neu gestartet + +lib: +- adm-enc28j60 eingefgt, treiber netzwerkchip +- adm-socket eingefgt, netzwerksocket +- adm-plx code ausgebaut +- bel-vga monitorsettings +- glob-con plexbus/lan-konstanten eingefgt +- glob-led-engine neue lib fr hbeat-led-pwm +- gui-dlbox - redraw beschleunigt +- gui-wbox - warnbox ist jetzt auch mit tab & esc bedienbar +- m-glob-con - konstanten fr sound und plexbus eingefgt + +reg-ios: +- testfunktion fr rtc +- lan funktionen eingefgt +- plexbus funktionen eingefgt +- printblk - stringausgabe mit lngenangabe + +system/administra: +- admnet eingefgt + +system/regnatix: +- fm - optimierungen und detailverbesserungen +- perplex - plexbus tool zugefgt +- regime - sysinfo zeigt jetzt auch devices am plexbus an +- man - systemklnge angepasst, damit nicht stndig der heartbeat beim lesen luft +- ramtest - anpassungen maske/farben + +dokumentation: +- neustrukturierung der texte + + + + + r56 - 11-05-2013-dr235 und weiter gehts mit dem frhjahresputz: diff --git a/lizenz.txt b/doku/y-lizenz.txt similarity index 93% rename from lizenz.txt rename to doku/y-lizenz.txt index c661b7f..636dd0d 100644 --- a/lizenz.txt +++ b/doku/y-lizenz.txt @@ -17,7 +17,6 @@ Informationen zum Projekt ------------------------------------------------------------------------- http://hive-project.de - Urheberrechtsangabe ------------------------------------------------------------------------- -Copyright (c) 2009 Ingo Kripahle \ No newline at end of file +Copyright (c) 2009 Ingo Kripahle diff --git a/flash/administra/admflash.spin b/flash/administra/admflash.spin index 175bc47cbf8487efc3a8950ccab4f20ec316bb46..6388b2a819532953aeda749520dd5cf4a22b35df 100644 GIT binary patch delta 3942 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 diff --git a/flash/bellatrix/belflash.spin b/flash/bellatrix/belflash.spin index da428b331a243871dc814ec80655a8fdae241a21..e2cc80d9815afbc58954cffe5d536dd7ee805f43 100644 GIT binary patch delta 549 zcmZ8eJxc>o5S*CUD2Ie7hor~}LSkVOPd#k~1uZm6(pbrvZ%r=oE*eOa!atzA!oML{ zSXtZo2do4OYYVZkaQ2;ok>kB(-_GvL&ON=yu0CV8>#2kd8(HM_Z8I)mMQy}q4!Wqq zhlMgaXrqfJTKc8N=%UU_AFpUIJ7(^)W)atcM`VxDN5Hopzb4=62$V5x#xq#O8gg*R z)W84>cgv|AGm*wNVIg6l8!GDTEjhGMV%Gj0L5do_w5$rz9`oH1%KxIWFff5MHuZE1 z#ZgJ@7m>0;K%o|6l?)L7hKDwd4aY^)STW)dxI~q?yrA2>`$ULkvb~sC;50E!tPFRQN`L+jOvXr?AIhWzq2y7APSQA{ wDFy6t*)5dR^~vnbekKwd&(q_9DmrshBLLXSeK05Gx3DflE(7O2a3arR-^y)ml>h($ delta 23 fcmbR6gXP>OmJJs2oA1fHh&S6=Znv{!yu<_mfPV>K diff --git a/flash/regnatix/regflash.spin b/flash/regnatix/regflash.spin index 24089dbced46709eb2873ef543a365c36f08e680..8d4c0c40c5d91d920602a25c51cef403ae323571 100644 GIT binary patch delta 52 zcmbPtPWjPU4C+Aa4Q9JBcrv&%gfav%I5LC)*&umd1}=tbFsT4k p2ZWQW#e*4Zn@@_jpA=^VVkRJF24WT Administra -\flash\bellatrix\belflash.spin --> Bellatrix -\flash\regnatix\regflash.spin --> Regnatix - - -Installation mit Forth: ------------------------ - -1. Mikrocontroller flashen: - -\flash\administra\admflash.spin --> Administra -\flash\bellatrix\belflash.spin --> Bellatrix -\flash\regnatix\regflash.spin --> Regnatix - -2. Der Schalter bleibt ab jetzt auf Regnatix stehen. Ein Terminalprogramm (ich verwende Tera Term) starten und 57600 Baud auf die Schnittstelle vom Hive (DIP steht auf Regnatix!) einstellen. Nach einem Reset meldet sich das Propforth im Terminalprogramm auf dem Hostcomputer. Datei "forth\basics.mod" in einem Editor öffnen, alles markieren, kopieren und im Terminal einfügen. Der Quelltext wird jetzt im Forth compiliert. - -3. Im Terminalfenster, also im Forth, dass Kommendo "saveforth" eingeben. Damit wird das gesamte Forthsystem mit der gerade neu compilierten Erweiterungen wieder im EEPROM als Image gespeichert. - -Nach einem Reset sollte sich das Forth jetzt komplett mit seinem Prompt sowohl auf dem angeschlossenen VGA-Monitor, als auch im Terminal melden. Im Prinzip benötigen wir nun das Terminalprogramm nicht mehr und können direkt am Hive arbeiten. Später, wenn man in Forth programmiert, ist die vorhandene Terminalschnittstelle aber manchmal sehr nützlich. - - - -Erstellen der SDCard: ---------------------- - -Im Prinzip kann jede normale FAT16/32 Karte verwendet werden. Lange Dateinamen werden nicht verwendet, Unterverzeichnisse sind kein Problem. Es ist sinnvoll, alle Dateien aus dem Verzeichnis "bin\sd-card\" auf die SD-Karte zu kopieren. - -Das Verzeichnis "system" hat eine besondere Bedeutung: Hier sollten sich die Tools, Erweiterungen und Bibliotheken befinden. Im PropForth: Mit dem Kommando "sys name.f" kann aus jedem anderen Verzeichnis ohne Wechsel eine Datei name.f im Verzeichnis System geladen und compiliert werden. - - - -Systemstart: ------------- - -Beim Systemstart wird immer das Forth aus dem EEPROM gestartet. So kann, wie mit den klassischen Homecomputern, sofort unkompliziert programmiert werden. Neben dem Forth gibt es im TriOS noch ein in Spin programmiertes Betriebssystem, welches sich dem Benutzer durch den Kommandointerpreter Regime präsentiert. Aus dem Forth kann diese mit dem Kommando "regime" gestartet werden. Im Gegenzug kann im laufenden Regime mit dem Kommando "forth" wieder zur integrierten Programmiersprache gewechselt werden. - -Wurde TriOS ohne Forth installiert, wird der Loader aus dem EEPROM gestartet und sofort die Kommandozeile "Regime" aus der Datei reg.sys gestartet. - - - - -3. Regime im Überblick -====================== - -Da wir ja drei verschiedene Teilsystem in unserem Computer haben, muss Regime wissen, für welchen Chip eine ausführbare Datei bestimmt ist. Den Typ ausführbarer Dateien kann Regime automatisch anhand der Dateinamenserweiterung unterscheiden: - -*.bin Regnatix-Code -*.bel Bellatrix-Code -*.adm Administra-Code - -Dabei genügt es, den Namen ohne Erweiterung einzugeben. Dennoch kann es vorkommen, das man eine normale Spin-Datei mit einer beliebigen Erweiterung gespeichert hat. Diese Datei kann man dann mit den Kommandos rload, aload oder bload ganz gezielt in einen Chip laden. - - - bin/adm/bel-datei wird gestartet -mount - SD-aufwerk mounten -unmount - SD-Laufwerk freigeben -dir wh - Verzeichnis anzeigen -type - Anzeige einer Textdatei -aload - Administra-Code laden -bload - Bellatrix-Code laden -rload - Regnatix-Code laden -del - Datei löschen -cls - Bildschirm löschen -free - Anzeige des freien Speichers auf SD-Card -attrib ashr - Dateiattribute ändern -cd - Verzeichnis wechseln -mkdir - Verzeichnis erstellen -rename - datei/verzeichnis umbenennen -format - SD-Laufwerk formatieren -reboot - Hive neu starten -sysinfo - Systeminformationen -color <0..7> - Farbe wählen -cogs - Belegung der COG's anzeigen -dmlist - Anzeige der Verzeichnis-Marker -dm - Marker-Verzeichnis wechseln -dmset - Marker setzen -dmclr - Marker löschen -forth - Forth starten - -Marker: -r - Marker für Root-Verzeichnis -s - Marker für System-Verzeichnis -u - Marker für User-Verzeichnis -a/b/c - Benutzerdefinierte Verzeichnismarker - -Die r, s, u-Marker werden vom System automatisch gesetzt und intern verwendet. - -RAMDISK: - -xload - Datei von SD-Laufwerk in RAM laden -xsave - Datei aus RAM auf SD-Laufwerk speichern -xdir - Verzeichnis im RAM anzeigen -xrename - Datei im RAM umbenennen -xdel - Datei im RAM löschen -xtype - Textdatei im RAM anzeigen - - - -EXTERNE KOMMANDOS: ------------------- - -Die meisten Kommandozeilentools zeigen mit dem Parameter /? eine Liste der Optionen an. - -sysconf - Systemeinstellungen -hplay - HSS-Player -wplay - WAV-Player -splay - SID-Player -yplay - Yamaha-Soundchip-Player -sfxtool - HSS-Soundeffekte erstellen - -vga.bin - VGA 1024 x 768 Pixel, 64 x 24 Zeichen -htext.bin - VGA 1024 x 768 Pixel, 128 x 48 Zeichen -tv.bin - TV-Textmodus 40 x 13 Zeichen - - - - -2. Forth im Überblick: -====================== - -Einige nützliche Kommandos befinden sich in dem Modul tools.mod. In den meisten Fällen ist es sinnvoll dieses Modul mit der Befehlssequenz "sys tools.mod saveforth" fest im Forth einzubinden. - - - -Wichtige Tastencodes: ---------------------- - -[ESC]-1 Screen 1, COG 1 -[ESC]-2 Screen 2, COG 2 -[ESC]-3 Screen 3, COG 3 -[ESC]-b Break, Reset der aktuellen COG -[ESC]-r Reset, Neustart Regnatix - - - -Wichtige Kommandos: -------------------- - -load - Datei laden und comilieren, Ausgabe Screen 3 -dload - wie load, aber Ausgabe aktueller Screen -sys - Datei aus sys-Verzeichnis laden und compilieren -ls - Dateiliste -lsl - Dateiliste- Long-Format -cd - in Verzeichniss wechseln -mount - SD-Card einbinden -unmount - SD-Card freigeben -words - Anzeige Wöterbuch -mod? - (tools.mod) Anzeige compilierter Erweiterungen -lib? - (tools.mod) Anzeige compilierter Bibliotheken -cog? - (tools.mod) Anzeige COG-Liste -cat - (tools.mod) Ausgabe einer Textdatei -less - (tools.mod) Zeilenweise Textausgabe -dm? - (tools.mod) Anzeige der Systemverzeichnisse -regime - CLI starten -aload - Adminsitra-Code laden -bload - Bellatrix-Code laden -spin - Spin-Programm starten - - - -Wichtige Dateien: ------------------ - -Die Dateien *.mod und *.lib enthalten ganz normale Forth-Quelltexte. Damit hat man schnell eine Übersicht über die grobe Funktion dieser Quellen: Lib's sind halt reine Sammlungen von Worten zu einer bestimmten Funktionsgruppe und MOD's sind mehr oder weniger fertige und abgeschlossene Programme. Ein Beispiel: - -Die Datei hss.lib enthält Worte um die HSS-Funktionen von Administra anzusprechen. Mit diesen Funktionen kann man nun ein Modul (Programm) wie einen HSS-Soundplayer schreiben. - -Im Gegensatz dazu die Datei splay.mod: Mit diesem Modul wird ein HSS-Soundplayer ins System eingefügt, welcher Funktionen aus der hss.lib verwendet. - -Die Datei benötigt man aber mehr oder weniger nur zur Entwicklung, ein fertiges Modul wie splay.mod enthält dann schon die die entsprechenden HSS-Worte die benötigt werden. - -Die ifnot: ... Anweisung sorgt dabei dafür, dass keine Funktionen doppelt in das Wörterbuch compiliert werden. Das ist quasi ein verteiltes und fein granuliertes Konzept analog zu einer DLL. Die Forth-Version funktioniert dabei aber im Gegensatz zu DLL's nicht auf Bibliotheks-, sondern auf Funktionsebene. - -*.mod Module, Forth-Erweiterungen für das System -*.lib Bibliotheken, grundlegende Wortsammlungen -*.adm Administra-Code (z.Bsp. admsid.adm für SIDCog-Code) -*.bel Bellatrix-Code -*.bin Spin-Code, im Normalfall zur Ausführung in Regnatix - -basics.f - (mod:basics) Hive-Core für PropForth -ari.lib - (lib:ari) Zusätzliche arithmetische Funktionen -cog.lib - (lib:cog) Zusätzliche COG-Funktionen -adm.lib - (lib:adm) Administra-Chipmanagment-Funktionen -hss.lib - (lib:hss) Bibliothek für Hydra-Sound-System -sfx.lib - (lib:sfx) Soundeffekt-Bibliothek -wav.lib - (lib:wav) Wave-Soundbibliothek - -bel.lib - (lib:bel) Bellatrix-Chipmanagment-Funktionen -key.lib - (lib:key) Tastatur-Bibliothek -scr.lib - (lib:scr) Screen-Bibliothek -sd0.lib - (lib:sd0) SD-Card-Bibliothek - -debug.f - Nützliche Worte zur Fehlersuche und Entwicklung -rom.f - EEPROM-Dateisystem -tools.f - Nützliche Tools (cat, less, dm?...) -hplay.f - HSS-Player -wplay.f - WAV-Player -splay.f - SID-Player - -Administra-Codedateien im SYS-Verzeichnis: - -admled.adm Testprogramm - HBeat-LED blinken lassen -admsid.adm SidCog-Version (wird von splay benötigt) -admsys.adm Standardcode für ADM mit SD/HSS/WAV -admym.adm Yamaha-Soundchip-Version -aterm96.adm Mini-OS für Administra (Testzwecke) - - - -Reset-Fehlercodes: ------------------- - -0011FFFF - stack overflow -0012FFFF - return stack overflow -0021FFFF - stack underflow -0022FFFF - return stack underflow -8100FFFF - no free cogs -8200FFFF - no free main memory -8400FFFF - fl no free main memory -8500FFFF - no free cog memory -8800FFFF - eeprom write error -9000FFFF - eeprom read error - - - -.err-Fehlercodes: ------------------ - -0 no error -1 fsys unmounted -2 fsys corrupted -3 fsys unsupported -4 not found -5 file not found -6 dir not found -7 file read only -8 end of file -9 end of directory -10 end of root -11 dir is full -12 dir is not empty -13 checksum error -14 reboot error -15 bpb corrupt -16 fsi corrupt -17 dir already exist -18 file already exist -19 out of disk free space -20 disk io error -21 command not found -22 timeout -23 parameter error diff --git a/lib/adm-enc28j60.spin b/lib/adm-enc28j60.spin new file mode 100644 index 0000000..c1c1eb0 --- /dev/null +++ b/lib/adm-enc28j60.spin @@ -0,0 +1,1042 @@ +{{ + ENC28J60 Ethernet MAC / PHY Driver + ---------------------------------- + + Copyright (c) 2006-2009 Harrison Pham + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + The latest version of this software can be obtained from + http://hdpham.com/PropTCP and http://obex.parallax.com/ + + Constant Names / Code Logic based on code from + Microchip Technology, Inc.'s enc28j60.c / enc28j60.h source files +}} + +CON + version = 6 ' major version + release = 0 ' minor version + +CON +' *************************************** +' ** ENC28J60 SRAM Defines ** +' *************************************** + ' ENC28J60 Frequency + enc_freq = 25_000_000 + + ' ENC28J60 SRAM Usage Constants + MAXFRAME = 1518 ' 6 (src addr) + 6 (dst addr) + 2 (type) + 1500 (data) + 4 (FCS CRC) = 1518 bytes + TX_BUFFER_SIZE = 1518 + + TXSTART = 8192 - (TX_BUFFER_SIZE + 8) + TXEND = TXSTART + (TX_BUFFER_SIZE + 8) + RXSTART = $0000 + RXSTOP = (TXSTART - 2) | $0001 ' must be odd (B5 Errata) + RXSIZE = (RXSTOP - RXSTART + 1) + +DAT +' *************************************** +' ** MAC Address Vars / Defaults ** +' *************************************** + ' ** This is the default MAC address used by this driver. The parent object + ' can override this by passing a pointer to a new MAC address in the public + ' start() method. It is recommend that this is done to provide a level of + ' abstraction and makes tcp stack design easier. + ' ** This is the ethernet MAC address, it is critical that you change this + ' if you have more than one device using this code on a local network. + ' ** If you plan on commercial deployment, you must purchase MAC address + ' groups from IEEE or some other standards organization. + eth_mac byte $02, $00, $00, $00, $00, $01 + +' *************************************** +' ** Global Variables ** +' *************************************** + rxlen word 0 + tx_end word 0 + + packetheader byte 0[6] + + 'packet byte 0[MAXFRAME] + +PUB start(_cs, _sck, _si, _so, xtalout, macptr) +'' Starts the driver (uses 1 cog for spi engine) + + ' Since some people don't have 25mhz crystals, we use the cog counters + ' to generate a 25mhz frequency for the ENC28J60 (I love the Propeller) + ' Note: This requires a main crystal that is a multiple of 25mhz (5mhz works). + spi_start(_cs, _sck, _so, _si, xtalout) + + ' If a MAC address pointer is provided (addr > -1) then copy it into + ' the MAC address array (this kind of wastes space, but simplifies usage). + if macptr > -1 + bytemove(@eth_mac, macptr, 6) + + delay_ms(50) + init_ENC28J60 + + ' return the chip silicon version + banksel(EREVID) + return rd_cntlreg(EREVID) + +PUB stop +'' Stops the driver, frees 1 cog + + spi_stop + +PUB rd_macreg(address) : data +'' Read MAC Control Register + + spi_out_cs(cRCR | address) + spi_out_cs(0) ' transmit dummy byte + data := spi_in ' get actual data + +PUB rd_cntlreg(address) : data +'' Read ETH Control Register + + spi_out_cs(cRCR | address) + data := spi_in + +PUB wr_reg(address, data) +'' Write MAC and ETH Control Register + + spi_out_cs(cWCR | address) + spi_out(data) + +PUB bfc_reg(address, data) +'' Clear Control Register Bits + + spi_out_cs(cBFC | address) + spi_out(data) + +PUB bfs_reg(address, data) +'' Set Control Register Bits + + spi_out_cs(cBFS | address) + spi_out(data) + +PUB soft_reset +'' Soft Reset ENC28J60 + + spi_out(cSC) + +PUB banksel(register) +'' Select Control Register Bank + + bfc_reg(ECON1, %0000_0011) + bfs_reg(ECON1, register >> 8) ' high byte + +PUB rd_phy(register) | low, high +'' Read ENC28J60 PHY Register + + banksel(MIREGADR) + wr_reg(MIREGADR, register) + wr_reg(MICMD, MICMD_MIIRD) + banksel(MISTAT) + repeat while ((rd_macreg(MISTAT) & MISTAT_BUSY) > 0) + banksel(MIREGADR) + wr_reg(MICMD, $00) + low := rd_macreg(MIRDL) + high := rd_macreg(MIRDH) + return (high << 8) + low + +PUB wr_phy(register, data) +'' Write ENC28J60 PHY Register + + banksel(MIREGADR) + wr_reg(MIREGADR, register) + wr_reg(MIWRL, data) + wr_reg(MIWRH, data >> 8) + banksel(MISTAT) + repeat while ((rd_macreg(MISTAT) & MISTAT_BUSY) > 0) + +PUB rd_sram : data +'' Read ENC28J60 8k Buffer Memory + + spi_out_cs(cRBM) + data := spi_in + +PUB wr_sram(data) +'' Write ENC28J60 8k Buffer Memory + + spi_out_cs(cWBM) + spi_out(data) + +PUB init_ENC28J60 | i +'' Init ENC28J60 Chip + + repeat + i := rd_cntlreg(ESTAT) + while (i & $08) OR (!i & ESTAT_CLKRDY) + + soft_reset + delay_ms(5) ' reset delay + + bfc_reg(ECON1, ECON1_RXEN) ' stop send / recv + bfc_reg(ECON1, ECON1_TXRTS) + + bfs_reg(ECON2, ECON2_AUTOINC) ' enable auto increment of sram pointers (already default) + + packetheader[nextpacket_low] := RXSTART + packetheader[nextpacket_high] := constant(RXSTART >> 8) + + banksel(ERDPTL) + wr_reg(ERDPTL, RXSTART) + wr_reg(ERDPTH, constant(RXSTART >> 8)) + + banksel(ERXSTL) + wr_reg(ERXSTL, RXSTART) + wr_reg(ERXSTH, constant(RXSTART >> 8)) + wr_reg(ERXRDPTL, RXSTOP) + wr_reg(ERXRDPTH, constant(RXSTOP >> 8)) + wr_reg(ERXNDL, RXSTOP) + wr_reg(ERXNDH, constant(RXSTOP >> 8)) + wr_reg(ETXSTL, TXSTART) + wr_reg(ETXSTH, constant(TXSTART >> 8)) + + banksel(MACON1) + wr_reg(MACON1, constant(MACON1_TXPAUS | MACON1_RXPAUS | MACON1_MARXEN)) + wr_reg(MACON3, constant(MACON3_TXCRCEN | MACON3_PADCFG0 | MACON3_FRMLNEN)) + + ' don't timeout transmissions on saturated media + wr_reg(MACON4, MACON4_DEFER) + ' collisions occur at 63rd byte + wr_reg(MACLCON2, 63) + + wr_reg(MAIPGL, $12) + wr_reg(MAIPGH, $0C) + wr_reg(MAMXFLL, MAXFRAME) + wr_reg(MAMXFLH, constant(MAXFRAME >> 8)) + + ' back-to-back inter-packet gap time + ' full duplex = 0x15 (9.6us) + ' half duplex = 0x12 (9.6us) + wr_reg(MABBIPG, $12) + wr_reg(MAIPGL, $12) + wr_reg(MAIPGH, $0C) + + ' write mac address to the chip + banksel(MAADR1) + wr_reg(MAADR1, eth_mac[0]) + wr_reg(MAADR2, eth_mac[1]) + wr_reg(MAADR3, eth_mac[2]) + wr_reg(MAADR4, eth_mac[3]) + wr_reg(MAADR5, eth_mac[4]) + wr_reg(MAADR6, eth_mac[5]) + + ' half duplex + wr_phy(PHCON2, PHCON2_HDLDIS) + wr_phy(PHCON1, $0000) + + ' set LED options + wr_phy(PHLCON, $0742) ' $0472 => ledA = link, ledB = tx/rx + ' $0742 => ledA = tx/rx, ledB = link + + ' enable packet reception + bfs_reg(ECON1, ECON1_RXEN) + +PUB get_frame(pktptr) | packet_addr, new_rdptr +'' Get Ethernet Frame from Buffer + + banksel(ERDPTL) + wr_reg(ERDPTL, packetheader[nextpacket_low]) + wr_reg(ERDPTH, packetheader[nextpacket_high]) + + repeat packet_addr from 0 to 5 + packetheader[packet_addr] := rd_sram + + rxlen := (packetheader[rec_bytecnt_high] << 8) + packetheader[rec_bytecnt_low] + + 'bytefill(@packet, 0, MAXFRAME) ' Uncomment this if you want to clean out the buffer first + ' otherwise, leave commented since it's faster to just leave stuff + ' in the buffer + + ' protect from oversized packet + if rxlen =< MAXFRAME + rd_block(pktptr, rxlen) + {repeat packet_addr from 0 to rxlen - 1 + BYTE[@packet][packet_addr] := rd_sram} + + new_rdptr := (packetheader[nextpacket_high] << 8) + packetheader[nextpacket_low] + + ' handle errata read pointer start (must be odd) + --new_rdptr + + if (new_rdptr < RXSTART) OR (new_rdptr > RXSTOP) + new_rdptr := RXSTOP + + bfs_reg(ECON2, ECON2_PKTDEC) + + banksel(ERXRDPTL) + wr_reg(ERXRDPTL, new_rdptr) + wr_reg(ERXRDPTH, new_rdptr >> 8) + +PUB start_frame +'' Start frame - Inits the NIC and sets stuff + + banksel(EWRPTL) + wr_reg(EWRPTL, TXSTART) + wr_reg(EWRPTH, constant(TXSTART >> 8)) + + tx_end := constant(TXSTART - 1) ' start location is really address 0, so we are sending a count of - 1 + + wr_frame(cTXCONTROL) + +PUB wr_frame(data) +'' Write frame data + + wr_sram(data) + ++tx_end + +PUB wr_block(startaddr, count) + blockwrite(startaddr, count) + tx_end += count + +PUB rd_block(startaddr, count) + blockread(startaddr, count) + +PUB send_frame +'' Sends frame +'' Will retry on send failure up to 15 times with a 1ms delay in between repeats + + repeat 15 + if p_send_frame ' send packet, if successful then quit retry loop + quit + delay_ms(1) + +PRI p_send_frame | i, eirval +' Sends the frame + banksel(ETXSTL) + wr_reg(ETXSTL, TXSTART) + wr_reg(ETXSTH, constant(TXSTART >> 8)) + + banksel(ETXNDL) + wr_reg(ETXNDL, tx_end) + wr_reg(ETXNDH, tx_end >> 8) + + ' B5 Errata #10 - Reset transmit logic before send + bfs_reg(ECON1, ECON1_TXRST) + bfc_reg(ECON1, ECON1_TXRST) + + ' B5 Errata #10 & #13: Reset interrupt error flags + bfc_reg(EIR, constant(EIR_TXERIF | EIR_TXIF)) + + ' trigger send + bfs_reg(ECON1, ECON1_TXRTS) + + ' fix for transmit stalls (derived from errata B5 #13), watches TXIF and TXERIF bits + ' also implements a ~3.75ms (15 * 250us) timeout if send fails (occurs on random packet collisions) + ' btw: this took over 10 hours to fix due to the elusive undocumented bug + i := 0 + repeat + eirval := rd_cntlreg(EIR) + if ((eirval & constant(EIR_TXERIF | EIR_TXIF)) > 0) + quit + if (++i => 15) + eirval := EIR_TXERIF + quit + delay_us(250) + + ' B5 Errata #13 - Reset TXRTS if failed send then reset logic + bfc_reg(ECON1, ECON1_TXRTS) + + if ((eirval & EIR_TXERIF) == 0) + return true ' successful send (no error interrupt) + else + return false ' failed send (error interrupt) + +PUB get_mac_pointer +'' Gets mac address pointer + return @eth_mac + +PUB get_rxlen +'' Gets received packet length + return rxlen - 4 ' knock off the 4 byte Frame Check Sequence CRC, not used anywhere outside of this driver (pg 31 datasheet) + +PRI delay_us(Duration) + waitcnt(((clkfreq / 1_000_000 * Duration - 3928)) + cnt) + +PRI delay_ms(Duration) + waitcnt(((clkfreq / 1_000 * Duration - 3932)) + cnt) + +' *************************************** +' ** ASM SPI Engine ** +' *************************************** +DAT + cog long 0 + command long 0 + +CON + SPIOUT = %0000_0001 + SPIIN = %0000_0010 + SRAMWRITE = %0000_0100 + SRAMREAD = %0000_1000 + CSON = %0001_0000 + CSOFF = %0010_0000 + CKSUM = %0100_0000 + + SPIBITS = 8 + +PRI spi_out(value) + setcommand(constant(SPIOUT | CSON | CSOFF), @value) + +PRI spi_out_cs(value) + setcommand(constant(SPIOUT | CSON), @value) + +PRI spi_in : value + setcommand(constant(SPIIN | CSON | CSOFF), @value) + +PRI spi_in_cs : value + setcommand(constant(SPIIN | CSON), @value) + +PRI blockwrite(startaddr, count) + setcommand(SRAMWRITE, @startaddr) + +PRI blockread(startaddr, count) + setcommand(SRAMREAD, @startaddr) + +PUB chksum_add(startaddr, count) + setcommand(CKSUM, @startaddr) + return startaddr + +PRI spi_start(_cs, _sck, _di, _do, _freqpin) + spi_stop + + cspin := |< _cs + dipin := |< _di + dopin := |< _do + clkpin := |< _sck + + ctramode := %0_00100_00_0000_0000_0000_0000_0000_0000 + _sck + ctrbmode := %0_00100_00_0000_0000_0000_0000_0000_0000 + _do + + spi_setupfreqsynth(_freqpin) + + cog := cognew(@init, @command) + 1 + +PRI spi_stop + if cog + cogstop(cog~ - 1) + ctra := 0 + command~ + +PRI setcommand(cmd, argptr) + command := cmd << 16 + argptr 'write command and pointer + repeat while command 'wait for command to be cleared, signifying receipt + +PRI spi_setupfreqsynth(pin) + + if pin < 0 + ' pin num was negative -> disable freq synth + return + + dira[pin] := 1 + + ctra := constant(%00010 << 26) '..set PLL mode + ctra |= constant((>|((enc_freq - 1) / 1_000_000)) << 23) 'set PLLDIV + + frqa := spi_fraction(enc_freq, CLKFREQ, constant(4 - (>|((enc_freq - 1) / 1_000_000)))) 'Compute FRQA/FRQB value + ctra |= pin 'set PINA to complete CTRA/CTRB value + +PRI spi_fraction(a, b, shift) : f + + if shift > 0 'if shift, pre-shift a or b left + a <<= shift 'to maintain significant bits while + if shift < 0 'insuring proper result + b <<= -shift + + repeat 32 'perform long division of a/b + f <<= 1 + if a => b + a -= b + f++ + a <<= 1 + +DAT + org +init or dira, cspin 'pin directions + andn dira, dipin + or dira, dopin + or dira, clkpin + + or outa, cspin 'turn off cs (bring it high) + + mov frqb, #0 'disable ctrb increment + mov ctrb, ctrbmode + + +loop wrlong zero,par 'zero command (tell spin we are done processing) +:subloop rdlong t1,par wz 'wait for command + if_z jmp #:subloop + + mov addr, t1 'used for holding return addr to spin vars + + rdlong arg0, t1 'arg0 + add t1, #4 + rdlong arg1, t1 'arg1 + + mov lkup, addr 'get the command var from spin + shr lkup, #16 'extract the cmd from the command var + + test lkup, #CSON wz 'turn on cs + if_nz andn outa, cspin + + test lkup, #SPIOUT wz 'spi out + if_nz call #spi_out_ + test lkup, #SPIIN wz 'spi in + if_nz call #xspi_in_ + test lkup, #SRAMWRITE wz 'sram block write + if_nz jmp #sram_write_ + test lkup, #SRAMREAD wz 'sram block read + if_nz jmp #sram_read_ + + test lkup, #CSOFF wz 'cs off + if_nz or outa, cspin + + test lkup, #CKSUM wz 'perform checksum + if_nz call #csum16 + + jmp #loop ' no cmd found + + +spi_out_ andn outa, clkpin + shl arg0, #24 + mov phsb, arg0 ' data to write + mov frqa, freqw ' 20MHz write frequency + mov phsa, #0 ' start at clocking at 0 + + mov ctra, ctramode ' send data @ 20MHz + rol phsb, #1 + rol phsb, #1 + rol phsb, #1 + rol phsb, #1 + rol phsb, #1 + rol phsb, #1 + rol phsb, #1 + mov ctra, #0 ' disable + andn outa, clkpin + +spi_out__ret ret + + +spi_in_ andn outa, clkpin + mov phsa, phsr ' start phs for clock + mov frqa, freqr ' 10MHz read frequency + nop + + mov ctra, ctramode ' start clocking + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + rcl arg0, #1 + test dipin, ina wc + mov ctra, #0 ' stop clocking + rcl arg0, #1 + andn outa, clkpin + +spi_in__ret ret + +xspi_in_ call #spi_in_ + wrbyte arg0, addr ' write byte back to spin result var +xspi_in__ret ret + +' SRAM Block Read/Write +sram_write_ ' block write (arg0=hub addr, arg1=count) + mov t1, arg0 + mov t2, arg1 + + andn outa, cspin + mov arg0, #cWBM + call #spi_out_ +:loop rdbyte arg0, t1 + call #spi_out_ + add t1, #1 + djnz t2, #:loop + or outa, cspin + + jmp #loop + +sram_read_ ' block read (arg0=hub addr, arg1=count) + mov t1, arg0 + mov t2, arg1 + + andn outa, cspin + mov arg0, #cRBM + call #spi_out_ +:loop call #spi_in_ + wrbyte arg0, t1 + add t1, #1 + djnz t2, #:loop + or outa, cspin + + jmp #loop + +csum16 ' performs checksum 16bit additions on the data + ' arg0=hub addr, arg1=length, writes sum to first arg + mov t1, #0 ' clear sum +:loop rdbyte t2, arg0 ' read two bytes (16 bits) + add arg0, #1 + rdbyte t3, arg0 + add arg0, #1 + shl t2, #8 ' build the word + add t2, t3 + add t1, t2 ' add numbers + mov t2, t1 ' add lower and upper words together + shr t2, #16 + and t1, hffff + add t1, t2 + sub arg1, #2 + cmp arg1, #1 wz, wc + if_nc_and_nz jmp #:loop + if_z rdbyte t2, arg0 ' add last byte (odd) + if_z shl t2, #8 + if_z add t1, t2 + wrlong t1, addr ' return result back to SPIN +csum16_ret ret + +zero long 0 'constants + + 'values filled by spin code before launching +cspin long 0 ' chip select pin +dipin long 0 ' data in pin (enc28j60 -> prop) +dopin long 0 ' data out pin (prop -> enc28j60) +clkpin long 0 ' clock pin (prop -> enc28j60) +ctramode long 0 ' ctr mode for CLK +ctrbmode long 0 ' ctr mode for SPI Out + +hffff long $FFFF + +freqr long $2000_0000 'frequency of SCK /8 for receive +freqw long $4000_0000 'frequency of SCK /4 for send +phsr long $6000_0000 + + 'temp variables +t1 res 1 ' loop and cog shutdown +t2 res 1 ' loop and cog shutdown +t3 res 1 ' Used to hold DataValue SHIFTIN/SHIFTOUT +t4 res 1 ' Used to hold # of Bits +t5 res 1 ' Used for temporary data mask + +addr res 1 ' Used to hold return address of first Argument passed +lkup res 1 ' Used to hold command lookup + + 'arguments passed to/from high-level Spin +arg0 res 1 ' bits / start address +arg1 res 1 ' value / count + +CON +' *************************************** +' ** ENC28J60 Control Constants ** +' *************************************** + ' ENC28J60 opcodes (OR with 5bit address) + cWCR = %010 << 5 ' write control register command + cBFS = %100 << 5 ' bit field set command + cBFC = %101 << 5 ' bit field clear command + cRCR = %000 << 5 ' read control register command + cRBM = (%001 << 5) | $1A ' read buffer memory command + cWBM = (%011 << 5) | $1A ' write buffer memory command + cSC = (%111 << 5) | $1F ' system command + + ' This is used to trigger TX in the ENC28J60, it shouldn't change, but you never know... + cTXCONTROL = $0E + + ' Packet header format (tail of the receive packet in the ENC28J60 SRAM) + #0,nextpacket_low,nextpacket_high,rec_bytecnt_low,rec_bytecnt_high,rec_status_low,rec_status_high + +' *************************************** +' ** ENC28J60 Register Defines ** +' *************************************** + ' Bank 0 registers -------- + ERDPTL = $00 + ERDPTH = $01 + EWRPTL = $02 + EWRPTH = $03 + ETXSTL = $04 + ETXSTH = $05 + ETXNDL = $06 + ETXNDH = $07 + ERXSTL = $08 + ERXSTH = $09 + ERXNDL = $0A + ERXNDH = $0B + ERXRDPTL = $0C + ERXRDPTH = $0D + ERXWRPTL = $0E + ERXWRPTH = $0F + EDMASTL = $10 + EDMASTH = $11 + EDMANDL = $12 + EDMANDH = $13 + EDMADSTL = $14 + EDMADSTH = $15 + EDMACSL = $16 + EDMACSH = $17 + ' = $18 + ' = $19 + ' r = $1A + EIE = $1B + EIR = $1C + ESTAT = $1D + ECON2 = $1E + ECON1 = $1F + + ' Bank 1 registers ----- + EHT0 = $100 + EHT1 = $101 + EHT2 = $102 + EHT3 = $103 + EHT4 = $104 + EHT5 = $105 + EHT6 = $106 + EHT7 = $107 + EPMM0 = $108 + EPMM1 = $109 + EPMM2 = $10A + EPMM3 = $10B + EPMM4 = $10C + EPMM5 = $10D + EPMM6 = $10E + EPMM7 = $10F + EPMCSL = $110 + EPMCSH = $111 + ' = $112 + ' = $113 + EPMOL = $114 + EPMOH = $115 + EWOLIE = $116 + EWOLIR = $117 + ERXFCON = $118 + EPKTCNT = $119 + ' r = $11A + ' EIE = $11B + ' EIR = $11C + ' ESTAT = $11D + ' ECON2 = $11E + ' ECON1 = $11F + + ' Bank 2 registers ----- + MACON1 = $200 + MACON2 = $201 + MACON3 = $202 + MACON4 = $203 + MABBIPG = $204 + ' = $205 + MAIPGL = $206 + MAIPGH = $207 + MACLCON1 = $208 + MACLCON2 = $209 + MAMXFLL = $20A + MAMXFLH = $20B + ' r = $20C + MAPHSUP = $20D + ' r = $20E + ' = $20F + ' r = $210 + MICON = $211 + MICMD = $212 + ' = $213 + MIREGADR = $214 + ' r = $215 + MIWRL = $216 + MIWRH = $217 + MIRDL = $218 + MIRDH = $219 + ' r = $21A + ' EIE = $21B + ' EIR = $21C + ' ESTAT = $21D + ' ECON2 = $21E + ' ECON1 = $21F + + ' Bank 3 registers ----- + + MAADR5 = $300 + MAADR6 = $301 + MAADR3 = $302 + MAADR4 = $303 + MAADR1 = $304 + MAADR2 = $305 + + {MAADR1 = $300 + MAADR0 = $301 + MAADR3 = $302 + MAADR2 = $303 + MAADR5 = $304 + MAADR4 = $305} + + EBSTSD = $306 + EBSTCON = $307 + EBSTCSL = $308 + EBSTCSH = $309 + MISTAT = $30A + ' = $30B + ' = $30C + ' = $30D + ' = $30E + ' = $30F + ' = $310 + ' = $311 + EREVID = $312 + ' = $313 + ' = $314 + ECOCON = $315 + ' EPHTST $316 + EFLOCON = $317 + EPAUSL = $318 + EPAUSH = $319 + ' r = $31A + ' EIE = $31B + ' EIR = $31C + ' ESTAT = $31D + ' ECON2 = $31E + ' ECON1 = $31F + + {****************************************************************************** + * PH Register Locations + ******************************************************************************} + PHCON1 = $00 + PHSTAT1 = $01 + PHID1 = $02 + PHID2 = $03 + PHCON2 = $10 + PHSTAT2 = $11 + PHIE = $12 + PHIR = $13 + PHLCON = $14 + + {****************************************************************************** + * Individual Register Bits + ******************************************************************************} + ' ETH/MAC/MII bits + + ' EIE bits ---------- + EIE_INTIE = (1<<7) + EIE_PKTIE = (1<<6) + EIE_DMAIE = (1<<5) + EIE_LINKIE = (1<<4) + EIE_TXIE = (1<<3) + EIE_WOLIE = (1<<2) + EIE_TXERIE = (1<<1) + EIE_RXERIE = (1) + + ' EIR bits ---------- + EIR_PKTIF = (1<<6) + EIR_DMAIF = (1<<5) + EIR_LINKIF = (1<<4) + EIR_TXIF = (1<<3) + EIR_WOLIF = (1<<2) + EIR_TXERIF = (1<<1) + EIR_RXERIF = (1) + + ' ESTAT bits --------- + ESTAT_INT = (1<<7) + ESTAT_LATECOL = (1<<4) + ESTAT_RXBUSY = (1<<2) + ESTAT_TXABRT = (1<<1) + ESTAT_CLKRDY = (1) + + ' ECON2 bits -------- + ECON2_AUTOINC = (1<<7) + ECON2_PKTDEC = (1<<6) + ECON2_PWRSV = (1<<5) + ECON2_VRTP = (1<<4) + ECON2_VRPS = (1<<3) + + ' ECON1 bits -------- + ECON1_TXRST = (1<<7) + ECON1_RXRST = (1<<6) + ECON1_DMAST = (1<<5) + ECON1_CSUMEN = (1<<4) + ECON1_TXRTS = (1<<3) + ECON1_RXEN = (1<<2) + ECON1_BSEL1 = (1<<1) + ECON1_BSEL0 = (1) + + ' EWOLIE bits ------- + EWOLIE_UCWOLIE = (1<<7) + EWOLIE_AWOLIE = (1<<6) + EWOLIE_PMWOLIE = (1<<4) + EWOLIE_MPWOLIE = (1<<3) + EWOLIE_HTWOLIE = (1<<2) + EWOLIE_MCWOLIE = (1<<1) + EWOLIE_BCWOLIE = (1) + + ' EWOLIR bits ------- + EWOLIR_UCWOLIF = (1<<7) + EWOLIR_AWOLIF = (1<<6) + EWOLIR_PMWOLIF = (1<<4) + EWOLIR_MPWOLIF = (1<<3) + EWOLIR_HTWOLIF = (1<<2) + EWOLIR_MCWOLIF = (1<<1) + EWOLIR_BCWOLIF = (1) + + ' ERXFCON bits ------ + ERXFCON_UCEN = (1<<7) + ERXFCON_ANDOR = (1<<6) + ERXFCON_CRCEN = (1<<5) + ERXFCON_PMEN = (1<<4) + ERXFCON_MPEN = (1<<3) + ERXFCON_HTEN = (1<<2) + ERXFCON_MCEN = (1<<1) + ERXFCON_BCEN = (1) + + ' MACON1 bits -------- + MACON1_LOOPBK = (1<<4) + MACON1_TXPAUS = (1<<3) + MACON1_RXPAUS = (1<<2) + MACON1_PASSALL = (1<<1) + MACON1_MARXEN = (1) + + ' MACON2 bits -------- + MACON2_MARST = (1<<7) + MACON2_RNDRST = (1<<6) + MACON2_MARXRST = (1<<3) + MACON2_RFUNRST = (1<<2) + MACON2_MATXRST = (1<<1) + MACON2_TFUNRST = (1) + + ' MACON3 bits -------- + MACON3_PADCFG2 = (1<<7) + MACON3_PADCFG1 = (1<<6) + MACON3_PADCFG0 = (1<<5) + MACON3_TXCRCEN = (1<<4) + MACON3_PHDRLEN = (1<<3) + MACON3_HFRMEN = (1<<2) + MACON3_FRMLNEN = (1<<1) + MACON3_FULDPX = (1) + + ' MACON4 bits -------- + MACON4_DEFER = (1<<6) + MACON4_BPEN = (1<<5) + MACON4_NOBKOFF = (1<<4) + MACON4_LONGPRE = (1<<1) + MACON4_PUREPRE = (1) + + ' MAPHSUP bits ---- + MAPHSUP_RSTRMII = (1<<3) + + ' MICON bits -------- + MICON_RSTMII = (1<<7) + + ' MICMD bits --------- + MICMD_MIISCAN = (1<<1) + MICMD_MIIRD = (1) + + ' EBSTCON bits ----- + EBSTCON_PSV2 = (1<<7) + EBSTCON_PSV1 = (1<<6) + EBSTCON_PSV0 = (1<<5) + EBSTCON_PSEL = (1<<4) + EBSTCON_TMSEL1 = (1<<3) + EBSTCON_TMSEL0 = (1<<2) + EBSTCON_TME = (1<<1) + EBSTCON_BISTST = (1) + + ' MISTAT bits -------- + MISTAT_NVALID = (1<<2) + MISTAT_SCAN = (1<<1) + MISTAT_BUSY = (1) + + ' ECOCON bits ------- + ECOCON_COCON2 = (1<<2) + ECOCON_COCON1 = (1<<1) + ECOCON_COCON0 = (1) + + ' EFLOCON bits ----- + EFLOCON_FULDPXS = (1<<2) + EFLOCON_FCEN1 = (1<<1) + EFLOCON_FCEN0 = (1) + + + + ' PHY bits + + ' PHCON1 bits ---------- + PHCON1_PRST = (1<<15) + PHCON1_PLOOPBK = (1<<14) + PHCON1_PPWRSV = (1<<11) + PHCON1_PDPXMD = (1<<8) + + ' PHSTAT1 bits -------- + PHSTAT1_PFDPX = (1<<12) + PHSTAT1_PHDPX = (1<<11) + PHSTAT1_LLSTAT = (1<<2) + PHSTAT1_JBSTAT = (1<<1) + + ' PHID2 bits -------- + PHID2_PID24 = (1<<15) + PHID2_PID23 = (1<<14) + PHID2_PID22 = (1<<13) + PHID2_PID21 = (1<<12) + PHID2_PID20 = (1<<11) + PHID2_PID19 = (1<<10) + PHID2_PPN5 = (1<<9) + PHID2_PPN4 = (1<<8) + PHID2_PPN3 = (1<<7) + PHID2_PPN2 = (1<<6) + PHID2_PPN1 = (1<<5) + PHID2_PPN0 = (1<<4) + PHID2_PREV3 = (1<<3) + PHID2_PREV2 = (1<<2) + PHID2_PREV1 = (1<<1) + PHID2_PREV0 = (1) + + ' PHCON2 bits ---------- + PHCON2_FRCLNK = (1<<14) + PHCON2_TXDIS = (1<<13) + PHCON2_JABBER = (1<<10) + PHCON2_HDLDIS = (1<<8) + + ' PHSTAT2 bits -------- + PHSTAT2_TXSTAT = (1<<13) + PHSTAT2_RXSTAT = (1<<12) + PHSTAT2_COLSTAT = (1<<11) + PHSTAT2_LSTAT = (1<<10) + PHSTAT2_DPXSTAT = (1<<9) + PHSTAT2_PLRITY = (1<<5) + + ' PHIE bits ----------- + PHIE_PLNKIE = (1<<4) + PHIE_PGEIE = (1<<1) + + ' PHIR bits ----------- + PHIR_PLNKIF = (1<<4) + PHIR_PGIF = (1<<2) + + ' PHLCON bits ------- + PHLCON_LACFG3 = (1<<11) + PHLCON_LACFG2 = (1<<10) + PHLCON_LACFG1 = (1<<9) + PHLCON_LACFG0 = (1<<8) + PHLCON_LBCFG3 = (1<<7) + PHLCON_LBCFG2 = (1<<6) + PHLCON_LBCFG1 = (1<<5) + PHLCON_LBCFG0 = (1<<4) + PHLCON_LFRQ1 = (1<<3) + PHLCON_LFRQ0 = (1<<2) + PHLCON_STRCH = (1<<1) \ No newline at end of file diff --git a/lib/adm-plx.spin b/lib/adm-plx.spin index 6917a14823a9ce1bc0ea83b8fd10cc0b53fbdc34..9e7bb548c4901478937ad053e577ade7a1dd2e44 100644 GIT binary patch literal 17534 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 diff --git a/lib/adm-socket.spin b/lib/adm-socket.spin new file mode 100644 index 0000000..6ecf2e0 --- /dev/null +++ b/lib/adm-socket.spin @@ -0,0 +1,1221 @@ +{{ + Ethernet TCP/IP Socket Layer Driver (IPv4) + ------------------------------------------ + + Copyright (c) 2006-2009 Harrison Pham + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + The latest version of this software can be obtained from + http://hdpham.com/PropTCP and http://obex.parallax.com/ +}} + +'' NOTICE: All buffer sizes must be a power of 2! + +CON +' *************************************** +' ** Versioning Information ** +' *************************************** + version = 5 ' major version + release = 2 ' minor version + apiversion = 8 ' api compatibility version + +' *************************************** +' ** User Definable Settings ** +' *************************************** + sNumSockets = 4 ' max number of concurrent registered sockets (max of 255) + +' *** End of user definable settings, don't edit anything below this line!!! +' *** All IP/MAC settings are defined by calling the start(...) method + +CON +' *************************************** +' ** Return Codes / Errors ** +' *************************************** + + RETBUFFEREMPTY = -1 ' no data available + RETBUFFERFULL = -1 ' buffer full + + ERRGENERIC = -1 ' generic errors + + ERR = -100 ' error codes start at -100 + ERRBADHANDLE = ERR - 1 ' bad socket handle + ERROUTOFSOCKETS = ERR - 2 ' no free sockets available + ERRSOCKETCLOSED = ERR - 3 ' socket closed, could not perform operation + +OBJ + nic : "adm-enc28j60" + + 'ser : "SerialMirror" + 'stk : "Stack Length" + +CON +' *************************************** +' ** Socket Constants and Offsets ** +' *************************************** + +' Socket states (user should never touch these) + SCLOSED = 0 ' closed, handle not used + SLISTEN = 1 ' listening, in server mode + SSYNSENT = 2 ' SYN sent, server mode, waits for ACK + SSYNSENTCL = 3 ' SYN sent, client mode, waits for SYN+ACK + SESTABLISHED = 4 ' established connection (either SYN+ACK, or ACK+Data) + SCLOSING = 5 ' connection is being forced closed by code + SCLOSING2 = 6 ' closing, we are waiting for a fin now + SFORCECLOSE = 7 ' force connection close (just RSTs, no waiting for FIN or anything) + SCONNECTINGARP1 = 8 ' connecting, next step: send arp request + SCONNECTINGARP2 = 9 ' connecting, next step: arp request sent, waiting for response + SCONNECTINGARP2G = 10 ' connecting, next step: arp request sent, waiting for response [GATEWAY REQUEST] + SCONNECTING = 11 ' connecting, next step: got mac address, send SYN + +' *************************************** +' ** TCP State Management Constants ** +' *************************************** + TIMEOUTMS = 500 ' (milliseconds) timeout before a retransmit occurs + RSTTIMEOUTMS = 2000 ' (milliseconds) timeout before a RST is sent to close the connection + WINDOWUPDATEMS = 25 ' (milliseconds) window advertisement frequency + + MAXUNACKS = 6 ' max number of unacknowledged retransmits before the stack auto closes the socket + ' timeout = TIMEOUTMS * MAXUNACKS (default: 500ms * 5 = 3000ms) + + EPHPORTSTART = 49152 ' ephemeral port start + EPHPORTEND = 65535 ' end + + MAXPAYLOAD = 1200 ' maximum TCP payload (data) in bytes, this only applies when your txbuffer_length > payload size + +DAT +' *************************************** +' ** Global Variables ** +' *************************************** + cog long 0 ' cog index (for stopping / starting) + stack long 0[128] ' stack for new cog (currently ~74 longs, using 128 for expansion) + + mac_ptr long 0 ' mac address pointer + + pkt_id long 0 ' packet fragmentation id + pkt_isn long 0 ' packet initial sequence number + + ip_ephport word 0 ' packet ephemeral port number (49152 to 65535) + + pkt_count byte 0 ' packet count + + lock_id byte 0 ' socket handle lock + + packet byte 0[nic#MAXFRAME] ' the ethernet frame + +' *************************************** +' ** IP Address Defaults ** +' *************************************** + ' NOTE: All of the MAC/IP variables here contain default values that will + ' be used if override values are not provided as parameters in start(). + long ' long alignment for addresses + ip_addr byte 10, 10, 1, 4 ' device's ip address + ip_subnet byte 255, 255, 255, 0 ' network subnet + ip_gateway byte 10, 10, 1, 254 ' network gateway (router) + ip_dns byte 10, 10, 1, 254 ' network dns + +' *************************************** +' ** Socket Data Arrays ** +' *************************************** + + long + SocketArrayStart + lMySeqNum long 0[sNumSockets] + lMyAckNum long 0[sNumSockets] + lSrcIp long 0[sNumSockets] + lTime long 0[sNumSockets] + + word + wSrcPort word 0[sNumSockets] + wDstPort word 0[sNumSockets] + wLastWin word 0[sNumSockets] + wLastTxLen word 0[sNumSockets] + wNotAcked word 0[sNumSockets] + + byte + bSrcMac byte 0[sNumSockets * 6] + bConState byte 0[sNumSockets] + SocketArrayEnd + +' *************************************** +' ** Circular Buffer Arrays ** +' *************************************** + word + FifoDataStart + rx_head word 0[sNumSockets] ' rx head array + rx_tail word 0[sNumSockets] ' rx tail array + tx_head word 0[sNumSockets] ' tx head array + tx_tail word 0[sNumSockets] ' tx tail array + + tx_tailnew word 0[sNumSockets] ' the new tx_tail value (unacked data) + + rxbuffer_length word 0[sNumSockets] ' each socket's buffer sizes + txbuffer_length word 0[sNumSockets] + + rxbuffer_mask word 0[sNumSockets] ' each socket's buffer masks for capping buffer sizes + txbuffer_mask word 0[sNumSockets] + + long + tx_bufferptr long 0[sNumSockets] ' pointer addresses to each socket's buffer spaces + rx_bufferptr long 0[sNumSockets] + FifoDataEnd + +PUB start(cs, sck, si, so, xtalout, macptr, ipconfigptr) +'' Start the TCP/IP Stack (requires 2 cogs) +'' Only call this once, otherwise you will get conflicts +'' macptr = HUB memory pointer (address) to 6 contiguous mac address bytes +'' ipconfigptr = HUB memory pointer (address) to ip configuration block (16 bytes) +'' Must be in order: ip_addr, ip_subnet, ip_gateway, ip_dns + + stop + 'stk.Init(@stack, 128) + + ' zero socket data arrays (clean up any dead stuff from previous instance) + bytefill(@SocketArrayStart, 0, @SocketArrayEnd - @SocketArrayStart) + + ' reset buffer pointers, zeros a contigous set of bytes, starting at rx_head + bytefill(@FifoDataStart, 0, @FifoDataEnd - @FifoDataStart) + + ' start new cog with tcp stack + cog := cognew(engine(cs, sck, si, so, xtalout, macptr, ipconfigptr), @stack) + 1 + +PUB stop +'' Stop the driver + + if cog + cogstop(cog~ - 1) ' stop the tcp engine + nic.stop ' stop nic driver (kills spi engine) + lockclr(lock_id) ' clear lock before returning it to the pool + lockret(lock_id) ' return the lock to the lock pool + +PRI engine(cs, sck, si, so, xtalout, macptr, ipconfigptr) | i + + lock_id := locknew ' checkout a lock from the HUB + lockclr(lock_id) ' clear the lock, just in case it was in a bad state + + ' Start the ENC28J60 driver in a new cog + nic.start(cs, sck, si, so, xtalout, macptr) ' init the nic + + if ipconfigptr > -1 ' init ip configuration + bytemove(@ip_addr, ipconfigptr, 16) + + mac_ptr := nic.get_mac_pointer ' get the local mac address pointer + + ip_ephport := EPHPORTSTART ' set initial ephemeral port number (might want to random seed this later) + + i := 0 + nic.banksel(nic#EPKTCNT) ' select packet count bank + repeat + pkt_count := nic.rd_cntlreg(nic#EPKTCNT) + if pkt_count > 0 + service_packet ' handle packet + nic.banksel(nic#EPKTCNT) ' re-select the packet count bank + + ++i + if i > 10 ' perform send tick + repeat while lockset(lock_id) + tick_tcpsend ' occurs every 10 cycles, since incoming packets more important + lockclr(lock_id) + + i := 0 + nic.banksel(nic#EPKTCNT) ' re-select the packet count bank + +PRI service_packet + + ' lets process this frame + nic.get_frame(@packet) + + ' check for arp packet type (highest priority obviously) + if packet[enetpacketType0] == $08 AND packet[enetpacketType1] == $06 + if packet[constant(arp_hwtype + 1)] == $01 AND packet[arp_prtype] == $08 AND packet[constant(arp_prtype + 1)] == $00 AND packet[arp_hwlen] == $06 AND packet[arp_prlen] == $04 + if packet[arp_tipaddr] == ip_addr[0] AND packet[constant(arp_tipaddr + 1)] == ip_addr[1] AND packet[constant(arp_tipaddr + 2)] == ip_addr[2] AND packet[constant(arp_tipaddr + 3)] == ip_addr[3] + case packet[constant(arp_op + 1)] + $01 : handle_arp + $02 : repeat while lockset(lock_id) + handle_arpreply + lockclr(lock_id) + '++count_arp + else + if packet[enetpacketType0] == $08 AND packet[enetpacketType1] == $00 + if packet[ip_destaddr] == ip_addr[0] AND packet[constant(ip_destaddr + 1)] == ip_addr[1] AND packet[constant(ip_destaddr + 2)] == ip_addr[2] AND packet[constant(ip_destaddr + 3)] == ip_addr[3] + case packet[ip_proto] + 'PROT_ICMP : 'handle_ping + 'ser.str(stk.GetLength(0, 0)) + 'stk.GetLength(30, 19200) + '++count_ping + PROT_TCP : repeat while lockset(lock_id) + \handle_tcp ' handles abort out of tcp handlers (no socket found) + lockclr(lock_id) + '++count_tcp + 'PROT_UDP : ++count_udp + +' ******************************* +' ** Protocol Receive Handlers ** +' ******************************* +PRI handle_arp | i + nic.start_frame + + ' destination mac address + repeat i from 0 to 5 + nic.wr_frame(packet[enetpacketSrc0 + i]) + + ' source mac address + repeat i from 0 to 5 + nic.wr_frame(BYTE[mac_ptr][i]) + + nic.wr_frame($08) ' arp packet + nic.wr_frame($06) + + nic.wr_frame($00) ' 10mb ethernet + nic.wr_frame($01) + + nic.wr_frame($08) ' ip proto + nic.wr_frame($00) + + nic.wr_frame($06) ' mac addr len + nic.wr_frame($04) ' proto addr len + + nic.wr_frame($00) ' arp reply + nic.wr_frame($02) + + ' write ethernet module mac address + repeat i from 0 to 5 + nic.wr_frame(BYTE[mac_ptr][i]) + + ' write ethernet module ip address + repeat i from 0 to 3 + nic.wr_frame(ip_addr[i]) + + ' write remote mac address + repeat i from 0 to 5 + nic.wr_frame(packet[enetpacketSrc0 + i]) + + ' write remote ip address + repeat i from 0 to 3 + nic.wr_frame(packet[arp_sipaddr + i]) + + return nic.send_frame + +PRI handle_arpreply | handle, ip, found + ' Gets arp reply if it is a response to an ip we have + + ip := (packet[constant(arp_sipaddr + 3)] << 24) + (packet[constant(arp_sipaddr + 2)] << 16) + (packet[constant(arp_sipaddr + 1)] << 8) + (packet[arp_sipaddr]) + + found := false + if ip == LONG[@ip_gateway] + ' find a handle that wants gateway mac + repeat handle from 0 to constant(sNumSockets - 1) + if bConState[handle] == SCONNECTINGARP2G + found := true + quit + else + ' find the one that wants this arp + repeat handle from 0 to constant(sNumSockets - 1) + if bConState[handle] == SCONNECTINGARP2 + if lSrcIp[handle] == ip + found := true + quit + + if found + bytemove(@bSrcMac[handle * 6], @packet + arp_shaddr, 6) + bConState[handle] := SCONNECTING + +'PRI handle_ping + ' Not implemented yet (save on space!) + +PRI handle_tcp | i, ptr, handle, srcip, dstport, srcport, datain_len + ' Handles incoming TCP packets + + srcip := packet[ip_srcaddr] << 24 + packet[constant(ip_srcaddr + 1)] << 16 + packet[constant(ip_srcaddr + 2)] << 8 + packet[constant(ip_srcaddr + 3)] + dstport := packet[TCP_destport] << 8 + packet[constant(TCP_destport + 1)] + srcport := packet[TCP_srcport] << 8 + packet[constant(TCP_srcport + 1)] + + handle := find_socket(srcip, dstport, srcport) ' if no sockets avail, it will abort out of this function + + ' at this point we assume we have an active socket, or a socket available to be used + datain_len := ((packet[ip_pktlen] << 8) + packet[constant(ip_pktlen + 1)]) - ((packet[ip_vers_len] & $0F) * 4) - (((packet[TCP_hdrlen] & $F0) >> 4) * 4) + + if (bConState[handle] == SSYNSENT OR bConState[handle] == SESTABLISHED) AND (packet[TCP_hdrflags] & TCP_ACK) AND datain_len > 0 + ' ACK, without SYN, with data + + ' set socket state, established session + bConState[handle] := SESTABLISHED + + i := packet[constant(TCP_seqnum + 3)] << 24 + packet[constant(TCP_seqnum + 2)] << 16 + packet[constant(TCP_seqnum + 1)] << 8 + packet[TCP_seqnum] + if lMyAckNum[handle] == i + if datain_len =< (rxbuffer_mask[handle] - ((rx_head[handle] - rx_tail[handle]) & rxbuffer_mask[handle])) + ' we have buffer space + ptr := rx_bufferptr[handle] + if (datain_len + rx_head[handle]) > rxbuffer_length[handle] + bytemove(ptr + rx_head[handle], @packet[TCP_data], rxbuffer_length[handle] - rx_head[handle]) + bytemove(ptr, @packet[TCP_data] + (rxbuffer_length[handle] - rx_head[handle]), datain_len - (rxbuffer_length[handle] - rx_head[handle])) + else + bytemove(ptr + rx_head[handle], @packet[TCP_data], datain_len) + rx_head[handle] := (rx_head[handle] + datain_len) & rxbuffer_mask[handle] + else + datain_len := 0 + + else + ' we had a bad ack number, meaning lost or out of order packet + ' we have to wait for the remote host to retransmit in order + datain_len := 0 + + ' recalculate ack number + lMyAckNum[handle] := conv_endianlong(conv_endianlong(lMyAckNum[handle]) + datain_len) + + ' ACK response + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_ACK) + send_tcpfinal(handle, 0) + + elseif (bConState[handle] == SSYNSENTCL) AND (packet[TCP_hdrflags] & TCP_SYN) AND (packet[TCP_hdrflags] & TCP_ACK) + ' We got a server response, so we ACK it + + bytemove(@lMySeqNum[handle], @packet + TCP_acknum, 4) + bytemove(@lMyAckNum[handle], @packet + TCP_seqnum, 4) + + lMyAckNum[handle] := conv_endianlong(conv_endianlong(lMyAckNum[handle]) + 1) + + ' ACK response + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_ACK) + send_tcpfinal(handle, 0) + + ' set socket state, established session + bConState[handle] := SESTABLISHED + + elseif (bConState[handle] == SLISTEN) AND (packet[TCP_hdrflags] & TCP_SYN) + ' Reply to SYN with SYN + ACK + + ' copy mac address so we don't have to keep an ARP table + bytemove(@bSrcMac[handle * 6], @packet + enetpacketSrc0, 6) + + ' copy ip, port data + bytemove(@lSrcIp[handle], @packet + ip_srcaddr, 4) + bytemove(@wSrcPort[handle], @packet + TCP_srcport, 2) + bytemove(@wDstPort[handle], @packet + TCP_destport, 2) + + ' get updated ack numbers + bytemove(@lMyAckNum[handle], @packet + TCP_seqnum, 4) + + lMyAckNum[handle] := conv_endianlong(conv_endianlong(lMyAckNum[handle]) + 1) + lMySeqNum[handle] := conv_endianlong(++pkt_isn) ' Initial seq num (random) + + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, constant(TCP_SYN | TCP_ACK)) + send_tcpfinal(handle, 0) + + ' incremement the sequence number for the next packet (it will be for an established connection) + lMySeqNum[handle] := conv_endianlong(conv_endianlong(lMySeqNum[handle]) + 1) + + ' set socket state, waiting for establish + bConState[handle] := SSYNSENT + + elseif (bConState[handle] == SESTABLISHED OR bConState[handle] == SCLOSING2) AND (packet[TCP_hdrflags] & TCP_FIN) + ' Reply to FIN with RST + + ' get updated sequence and ack numbers (gaurantee we have correct ones to kill connection with) + bytemove(@lMySeqNum[handle], @packet + TCP_acknum, 4) + bytemove(@lMyAckNum[handle], @packet + TCP_seqnum, 4) + + 'LONG[handle_addr + sMyAckNum] := conv_endianlong(conv_endianlong(LONG[handle_addr + sMyAckNum]) + 1) + + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_RST) + send_tcpfinal(handle, 0) + + ' set socket state, now free + bConState[handle] := SCLOSED + return + + elseif (bConState[handle] == SSYNSENT) AND (packet[TCP_hdrflags] & TCP_ACK) + ' if just an ack, and we sent a syn before, then it's established + ' this just gives us the ability to send on connect + bConState[handle] := SESTABLISHED + + elseif (packet[TCP_hdrflags] & TCP_RST) + ' Reset, reset states + bConState[handle] := SCLOSED + return + + if (bConState[handle] == SESTABLISHED OR bConState[handle] == SCLOSING) AND (packet[TCP_hdrflags] & TCP_ACK) + wNotAcked[handle] := 0 ' reset retransmit counter + ' check to see if our last sent data has been ack'd + i := packet[TCP_acknum] << 24 + packet[constant(TCP_acknum + 1)] << 16 + packet[constant(TCP_acknum + 2)] << 8 + packet[constant(TCP_acknum + 3)] + if i == (conv_endianlong(lMySeqNum[handle]) + wLastTxLen[handle]) + ' we received an ack for our last sent packet, so we update our sequence number and buffer pointers + lMySeqNum[handle] := conv_endianlong(conv_endianlong(lMySeqNum[handle]) + wLastTxLen[handle]) + tx_tail[handle] := tx_tailnew[handle] + wLastTxLen[handle] := 0 + + tcpsend(handle) ' send data + +PRI build_ipheaderskeleton(handle) | hdrlen, hdr_chksum + + bytemove(@packet + ip_destaddr, @lSrcIp[handle], 4) ' Set destination address + + bytemove(@packet + ip_srcaddr, @ip_addr, 4) ' Set source address + + bytemove(@packet + enetpacketDest0, @bSrcMac[handle * 6], 6) ' Set destination mac address + + bytemove(@packet + enetpacketSrc0, mac_ptr, 6) ' Set source mac address + + packet[enetpacketType0] := $08 + packet[constant(enetpacketType0 + 1)] := $00 + + packet[ip_vers_len] := $45 + packet[ip_tos] := $00 + + ++pkt_id + + packet[ip_id] := pkt_id >> 8 ' Used for fragmentation + packet[constant(ip_id + 1)] := pkt_id + + packet[ip_frag_offset] := $40 ' Don't fragment + packet[constant(ip_frag_offset + 1)] := 0 + + packet[ip_ttl] := $80 ' TTL = 128 + + packet[ip_proto] := $06 ' TCP protocol + +PRI build_tcpskeleton(handle, flags) | size + + bytemove(@packet + TCP_srcport, @wDstPort[handle], 2) ' Source port + bytemove(@packet + TCP_destport, @wSrcPort[handle], 2) ' Destination port + + bytemove(@packet + TCP_seqnum, @lMySeqNum[handle], 4) ' Seq Num + bytemove(@packet + TCP_acknum, @lMyAckNum[handle], 4) ' Ack Num + + packet[TCP_hdrlen] := $50 ' Header length + + packet[TCP_hdrflags] := flags ' TCP state flags + + ' we have to recalculate the window size often otherwise our stack + ' might explode from too much data :( + size := (rxbuffer_mask[handle] - ((rx_head[handle] - rx_tail[handle]) & rxbuffer_mask[handle])) + wLastWin[handle] := size + + packet[TCP_window] := (size & $FF00) >> 8 + packet[constant(TCP_window + 1)] := size & $FF + +PRI send_tcpfinal(handle, datalen) | i, tcplen, hdrlen, hdr_chksum + + tcplen := 40 + datalen ' real length = data + headers + + packet[ip_pktlen] := tcplen >> 8 + packet[constant(ip_pktlen + 1)] := tcplen + + ' calc ip header checksum + packet[ip_hdr_cksum] := $00 + packet[constant(ip_hdr_cksum + 1)] := $00 + hdrlen := (packet[ip_vers_len] & $0F) * 4 + hdr_chksum := calc_chksum(@packet[ip_vers_len], hdrlen) + packet[ip_hdr_cksum] := hdr_chksum >> 8 + packet[constant(ip_hdr_cksum + 1)] := hdr_chksum + + ' calc checksum + packet[TCP_cksum] := $00 + packet[constant(TCP_cksum + 1)] := $00 + hdr_chksum := nic.chksum_add(@packet[ip_srcaddr], 8) + hdr_chksum += packet[ip_proto] + i := tcplen - ((packet[ip_vers_len] & $0F) * 4) + hdr_chksum += i + hdr_chksum += nic.chksum_add(@packet[TCP_srcport], i) + hdr_chksum := calc_chksumfinal(hdr_chksum) + packet[TCP_cksum] := hdr_chksum >> 8 + packet[constant(TCP_cksum + 1)] := hdr_chksum + + tcplen += 14 + if tcplen < 60 + tcplen := 60 + + ' protect from buffer overrun + if tcplen => nic#TX_BUFFER_SIZE + return + + ' send the packet + nic.start_frame + nic.wr_block(@packet, tcplen) + nic.send_frame + + lTime[handle] := cnt ' update last sent time (for timeout detection) + +PRI find_socket(srcip, dstport, srcport) | handle, free_handle, listen_handle + ' Search for socket, matches ip address, port states + ' Returns handle address (start memory location of socket) + ' If no matches, will abort with -1 + ' If supplied with srcip = 0 then will return free unused handle, aborts with -1 if none avail + + free_handle := -1 + listen_handle := -1 + repeat handle from 0 to constant(sNumSockets - 1) + if bConState[handle] <> SCLOSED + if (lSrcIp[handle] == 0) OR (lSrcIp[handle] == conv_endianlong(srcip)) + ' ip match, ip socket srcip = 0, then will try to match dst port (find listening socket) + if (wDstPort[handle] == conv_endianword(dstport)) {AND (WORD[handle_addr + sSrcPort] == 0 OR WORD[handle_addr + sSrcPort] == conv_endianword(srcport))} + if wSrcPort[handle] == conv_endianword(srcport) + ' found exact socket match (established socket) + return handle + elseif wSrcPort[handle] == 0 + ' found a partial match (listening socket with no peer) + listen_handle := handle + elseif srcip == 0 + ' found a closed (unallocated) socket, save this as a free handle if we are searching for a free handle + free_handle := handle ' we found a free handle, may need this later + + if srcip <> 0 + ' return the listening handle we found + if listen_handle <> -1 + return listen_handle + else + ' searched for a free handle + if free_handle <> -1 + return free_handle + + ' could not find a matching socket / free socket... + abort -1 + +' ****************************** +' ** Transmit Buffer Handlers ** +' ****************************** +PRI tcpsend(handle) | ptr, len + ' Check buffers for data to send (called in main loop) + + if tx_tail[handle] == tx_head[handle] + ' no data in buffer, so just quit + return + + ' we have data to send, so send it + ptr := tx_bufferptr[handle] + len := ((tx_head[handle] - tx_tail[handle]) & txbuffer_mask[handle]) <# MAXPAYLOAD + if (len + tx_tail[handle]) > txbuffer_length[handle] + bytemove(@packet[TCP_data], ptr + tx_tail[handle], txbuffer_length[handle] - tx_tail[handle]) + bytemove(@packet[TCP_data] + (txbuffer_length[handle] - tx_tail[handle]), ptr, len - (txbuffer_length[handle] - tx_tail[handle])) + else + bytemove(@packet[TCP_data], ptr + tx_tail[handle], len) + tx_tailnew[handle] := (tx_tail[handle] + len) & txbuffer_mask[handle] + + wLastTxLen[handle] := len + + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_ACK {constant(TCP_ACK | TCP_PSH)}) + send_tcpfinal(handle, len) ' send actual data + + send_tcpfinal(handle, 0) ' send an empty packet to force the other side to ACK (hack to get around delayed acks) + + wNotAcked[handle]++ ' increment unacked packet counter + +PRI tick_tcpsend | handle, state, len + + repeat handle from 0 to constant(sNumSockets - 1) + state := bConState[handle] + + if state == SESTABLISHED OR state == SCLOSING + len := (rxbuffer_mask[handle] - ((rx_head[handle] - rx_tail[handle]) & rxbuffer_mask[handle])) + if wLastWin[handle] <> len AND len => (rxbuffer_length[handle] / 2) AND ((cnt - lTime[handle]) / (clkfreq / 1000) > WINDOWUPDATEMS) + ' update window size + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_ACK) + send_tcpfinal(handle, 0) + + if ((cnt - lTime[handle]) / (clkfreq / 1000) > TIMEOUTMS) OR wLastTxLen[handle] == 0 + ' send new data OR retransmit our last packet since the other side seems to have lost it + ' the remote host will respond with another dup ack, and we will get back on track (hopefully) + tcpsend(handle) + + if (state == SCLOSING) + + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, constant(TCP_ACK | TCP_FIN)) + send_tcpfinal(handle, 0) + + ' we now wait for the other side to terminate + bConState[handle] := SCLOSING2 + + elseif state == SCONNECTINGARP1 + ' We need to send an arp request + + arp_request_checkgateway(handle) + + elseif state == SCONNECTING + ' Yea! We got an arp response previously, so now we can send the SYN + + lMySeqNum[handle] := conv_endianlong(++pkt_isn) + lMyAckNum[handle] := 0 + + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_SYN) + send_tcpfinal(handle, 0) + + bConState[handle] := SSYNSENTCL + + elseif (state == SFORCECLOSE) OR (state == SESTABLISHED AND wNotAcked[handle] => MAXUNACKS) OR (lookdown(state: SCLOSING2, SSYNSENT, SSYNSENTCL, SCONNECTINGARP2, SCONNECTINGARP2G) {(state == SCLOSING2 OR state == SSYNSENT)} AND ((cnt - lTime[handle]) / (clkfreq / 1000) > RSTTIMEOUTMS)) + ' Force close (send RST, and say the socket is closed!) + + ' This is triggered when any of the following happens: + ' 1 - we don't get a response to our SSYNSENT state + ' 2 - we exceeded MAXUNACKS tcp retransmits (remote host lost) + ' 3 - we get stuck in the SSCLOSING2 state + ' 4 - we don't get a response to our client SYNSENTCL state + ' 5 - we don't get an ARP response state SCONNECTINGARP2 or SCONNECTINGARP2G + + build_ipheaderskeleton(handle) + build_tcpskeleton(handle, TCP_RST) + send_tcpfinal(handle, 0) + + bConState[handle] := SCLOSED + +PRI arp_request_checkgateway(handle) | ip_ptr + + ip_ptr := @lSrcIp[handle] + + if (BYTE[ip_ptr] & ip_subnet[0]) == (ip_addr[0] & ip_subnet[0]) AND (BYTE[ip_ptr + 1] & ip_subnet[1]) == (ip_addr[1] & ip_subnet[1]) AND (BYTE[ip_ptr + 2] & ip_subnet[2]) == (ip_addr[2] & ip_subnet[2]) AND (BYTE[ip_ptr + 3] & ip_subnet[3]) == (ip_addr[3] & ip_subnet[3]) + arp_request(conv_endianlong(LONG[ip_ptr])) + bConState[handle] := SCONNECTINGARP2 + else + arp_request(conv_endianlong(LONG[@ip_gateway])) + bConState[handle] := SCONNECTINGARP2G + + lTime[handle] := cnt + +PRI arp_request(ip) | i + nic.start_frame + + ' destination mac address (broadcast mac) + repeat i from 0 to 5 + nic.wr_frame($FF) + + ' source mac address (this device) + repeat i from 0 to 5 + nic.wr_frame(BYTE[mac_ptr][i]) + + nic.wr_frame($08) ' arp packet + nic.wr_frame($06) + + nic.wr_frame($00) ' 10mb ethernet + nic.wr_frame($01) + + nic.wr_frame($08) ' ip proto + nic.wr_frame($00) + + nic.wr_frame($06) ' mac addr len + nic.wr_frame($04) ' proto addr len + + nic.wr_frame($00) ' arp request + nic.wr_frame($01) + + ' source mac address (this device) + repeat i from 0 to 5 + nic.wr_frame(BYTE[mac_ptr][i]) + + ' source ip address (this device) + repeat i from 0 to 3 + nic.wr_frame(ip_addr[i]) + + ' unknown mac address area + repeat i from 0 to 5 + nic.wr_frame($00) + + ' figure out if we need router arp request or host arp request + ' this means some subnet masking + + ' dest ip address + repeat i from 3 to 0 + nic.wr_frame(ip.byte[i]) + + ' send the request + return nic.send_frame + +' ******************************* +' ** IP Packet Helpers (Calcs) ** +' ******************************* +PRI calc_chksum(ptr, hdrlen) : chksum + ' Calculates IP checksums + ' packet = pointer to IP packet + ' returns: chksum + ' http://www.geocities.com/SiliconValley/2072/bit33.txt + 'chksum := calc_chksumhalf(packet, hdrlen) + chksum := nic.chksum_add(ptr, hdrlen) + chksum := calc_chksumfinal(chksum) + +PRI calc_chksumfinal(chksumin) : chksum + ' Performs the final part of checksums + chksum := (chksumin >> 16) + (chksumin & $FFFF) + chksum := (!chksum) & $FFFF + +{PRI calc_chksumhalf(packet, hdrlen) : chksum + ' Calculates checksum without doing the final stage of calculations + chksum := 0 + repeat while hdrlen > 1 + chksum += (BYTE[packet++] << 8) + BYTE[packet++] + chksum := (chksum >> 16) + (chksum & $FFFF) + hdrlen -= 2 + if hdrlen > 0 + chksum += BYTE[packet] << 8} + +' *************************** +' ** Memory Access Helpers ** +' *************************** +PRI conv_endianlong(in) + 'return (in << 24) + ((in & $FF00) << 8) + ((in & $FF0000) >> 8) + (in >> 24) ' we can sometimes get away with shifting without masking, since shifts kill extra bits anyways + return (in.byte[0] << 24) + (in.byte[1] << 16) + (in.byte[2] << 8) + (in.byte[3]) + +PRI conv_endianword(in) + 'return ((in & $FF) << 8) + ((in & $FF00) >> 8) + return (in.byte[0] << 8) + (in.byte[1]) + +PRI _handleConvert(userHandle, ptrHandle) | handle +' Checks to see if a handle index is valid +' Aborts if the handle is invalid + + handle := userHandle.byte[0] ' extract the handle index from the lower 8 bits + + if handle < 0 OR handle > constant(sNumSockets - 1) ' check the handle index to make sure we don't go out of bounds + abort ERRBADHANDLE + + ' check handle to make sure it's the one we want (rid ourselves of bad user handles) + ' the current check method is as follows: + ' - compare sDstPort + + if wDstPort[handle] <> ((userHandle.byte[2] << 8) + userHandle.byte[1]) + abort ERRBADHANDLE + + ' if we got here without aborting then we can assume the handle is good + LONG[ptrHandle] := handle + +' ************************************ +' ** Public Accessors (Thread Safe) ** +' ************************************ +PUB listen(port, _ptrrxbuff, _rxlen, _ptrtxbuff, _txlen) | handle +'' Sets up a socket for listening on a port +'' port = port number to listen on +'' ptrrxbuff = pointer to the rxbuffer array +'' rxlen = length of the rxbuffer array (must be power of 2) +'' ptrtxbuff = pointer to the txbuffer array +'' txlen = length of the txbuffer array (must be power of 2) +'' Returns handle if available, ERROUTOFSOCKETS if none available +'' Nonblocking + + repeat while lockset(lock_id) + + ' just find any avail closed socket + handle := \find_socket(0, 0, 0) + + if handle < 0 + lockclr(lock_id) + abort ERROUTOFSOCKETS + + rx_bufferptr[handle] := _ptrrxbuff + tx_bufferptr[handle] := _ptrtxbuff + rxbuffer_length[handle] := _rxlen + txbuffer_length[handle] := _txlen + rxbuffer_mask[handle] := _rxlen - 1 + txbuffer_mask[handle] := _txlen - 1 + + lMySeqNum[handle] := 0 + lMyAckNum[handle] := 0 + lSrcIp[handle] := 0 + lTime[handle] := 0 + wLastTxLen[handle] := 0 + wNotAcked[handle] := 0 + bytefill(@bSrcMac[handle * 6], 0, 6) + + wSrcPort[handle] := 0 ' no source port yet + wDstPort[handle] := conv_endianword(port) ' we do have a dest port though + + wLastWin[handle] := rxbuffer_length[handle] + + tx_head[handle] := 0 + tx_tail[handle] := 0 + tx_tailnew[handle] := 0 + rx_head[handle] := 0 + rx_tail[handle] := 0 + + ' it's now listening + bConState[handle] := SLISTEN + + lockclr(lock_id) + + return ((port.byte[0] << 16) + (port.byte[1] << 8)) + handle + +PUB connect(ipaddr, remoteport, _ptrrxbuff, _rxlen, _ptrtxbuff, _txlen) | handle, user_handle +'' Connect to remote host +'' ipaddr = ipv4 address packed into a long (ie: 1.2.3.4 => $01_02_03_04) +'' remoteport = port number to connect to +'' ptrrxbuff = pointer to the rxbuffer array +'' rxlen = length of the rxbuffer array (must be power of 2) +'' ptrtxbuff = pointer to the txbuffer array +'' txlen = length of the txbuffer array (must be power of 2) +'' Returns handle to new socket, ERROUTOFSOCKETS if no socket available +'' Nonblocking + + repeat while lockset(lock_id) + + ' just find any avail closed socket + handle := \find_socket(0, 0, 0) + + if handle < 0 + lockclr(lock_id) + abort ERROUTOFSOCKETS + + rx_bufferptr[handle] := _ptrrxbuff + tx_bufferptr[handle] := _ptrtxbuff + rxbuffer_length[handle] := _rxlen + txbuffer_length[handle] := _txlen + rxbuffer_mask[handle] := _rxlen - 1 + txbuffer_mask[handle] := _txlen - 1 + + lMySeqNum[handle] := 0 + lMyAckNum[handle] := 0 + lTime[handle] := 0 + wLastTxLen[handle] := 0 + wNotAcked[handle] := 0 + bytefill(@bSrcMac[handle * 6], 0, 6) + + if(ip_ephport => EPHPORTEND) ' constrain ephport to specified range + ip_ephport := EPHPORTSTART + + user_handle := ((ip_ephport.byte[0] << 16) + (ip_ephport.byte[1] << 8)) + handle + + ' copy in ip, port data (with respect to the remote host, since we use same code as server) + lSrcIp[handle] := conv_endianlong(ipaddr) + wSrcPort[handle] := conv_endianword(remoteport) + wDstPort[handle] := conv_endianword(ip_ephport++) + + wLastWin[handle] := rxbuffer_length[handle] + + tx_head[handle] := 0 + tx_tail[handle] := 0 + tx_tailnew[handle] := 0 + rx_head[handle] := 0 + rx_tail[handle] := 0 + + bConState[handle] := SCONNECTINGARP1 + + lockclr(lock_id) + + return user_handle + +PUB close(user_handle) | handle, state +'' Closes a connection + + _handleConvert(user_handle, @handle) + + repeat while lockset(lock_id) + + state := bConState[handle] + + if state == SESTABLISHED + ' try to gracefully close the connection + bConState[handle] := SCLOSING + elseif state <> SCLOSING AND state <> SCLOSING2 + ' we only do an ungraceful close if we are not in ESTABLISHED, CLOSING, or CLOSING2 + bConState[handle] := SCLOSED + + lockclr(lock_id) + + ' wait for the socket to close, this is very important to prevent the client app from reusing the buffers + repeat until (bConState[handle] == SCLOSING2) or (bConState[handle] == SCLOSED) + +PUB isConnected(user_handle) | handle +'' Returns true if the socket is connected, false otherwise + + if \_handleConvert(user_handle, @handle) <> 0 + return false + + return (bConState[handle] == SESTABLISHED) + +PUB isValidHandle(user_handle) | handle +'' Checks to see if the handle is valid, handles will become invalid once they are used +'' In other words, a closed listening socket is now invalid, etc + + {if handle < 0 OR handle > constant(sNumSockets - 1) + ' obviously the handle index is out of range, so it's not valid! + return false} + + if \_handleConvert(user_handle, @handle) < 0 + return false + + return (bConState[handle] <> SCLOSED) + +PUB readDataNonBlocking(user_handle, ptr, maxlen) | handle, len, rxptr +'' Reads bytes from the socket +'' Returns number of read bytes +'' Not blocking (returns RETBUFFEREMPTY if no data) + + _handleConvert(user_handle, @handle) + + if rx_tail[handle] == rx_head[handle] + return RETBUFFEREMPTY + + len := (rx_head[handle] - rx_tail[handle]) & rxbuffer_mask[handle] + if maxlen < len + len := maxlen + + rxptr := rx_bufferptr[handle] + + if (len + rx_tail[handle]) > rxbuffer_length[handle] + bytemove(ptr, rxptr + rx_tail[handle], rxbuffer_length[handle] - rx_tail[handle]) + bytemove(ptr + (rxbuffer_length[handle] - rx_tail[handle]), rxptr, len - (rxbuffer_length[handle] - rx_tail[handle])) + else + bytemove(ptr, rxptr + rx_tail[handle], len) + + rx_tail[handle] := (rx_tail[handle] + len) & rxbuffer_mask[handle] + + return len + +PUB readData(user_handle, ptr, maxlen) : len | handle +'' Reads bytes from the socket +'' Returns the number of read bytes +'' Will block until data is received + + _handleConvert(user_handle, @handle) + + repeat while (len := readDataNonBlocking(user_handle, ptr, maxlen)) < 0 + ifnot isConnected(user_handle) + abort ERRSOCKETCLOSED + +PUB readByteNonBlocking(user_handle) : rxbyte | handle, ptr +'' Read a byte from the specified socket +'' Will not block (returns RETBUFFEREMPTY if no byte avail) + + _handleConvert(user_handle, @handle) + + rxbyte := RETBUFFEREMPTY + if rx_tail[handle] <> rx_head[handle] + ptr := rx_bufferptr[handle] + rxbyte := BYTE[ptr][rx_tail[handle]] + rx_tail[handle] := (rx_tail[handle] + 1) & rxbuffer_mask[handle] + +PUB readByte(user_handle) : rxbyte | handle, ptr +'' Read a byte from the specified socket +'' Will block until a byte is received + + _handleConvert(user_handle, @handle) + + repeat while (rxbyte := readByteNonBlocking(user_handle)) < 0 + ifnot isConnected(user_handle) + abort ERRSOCKETCLOSED + +PUB writeDataNonBlocking(user_handle, ptr, len) | handle, txptr +'' Writes bytes to the socket +'' Will not write anything unless your data fits in the buffer +'' Non blocking (returns RETBUFFERFULL if can't fit data) + + _handleConvert(user_handle, @handle) + + if (txbuffer_mask[handle] - ((tx_head[handle] - tx_tail[handle]) & txbuffer_mask[handle])) < len + return RETBUFFERFULL + + txptr := tx_bufferptr[handle] + + if (len + tx_head[handle]) > txbuffer_length[handle] + bytemove(txptr + tx_head[handle], ptr, txbuffer_length[handle] - tx_head[handle]) + bytemove(txptr, ptr + (txbuffer_length[handle] - tx_head[handle]), len - (txbuffer_length[handle] - tx_head[handle])) + else + bytemove(txptr + tx_head[handle], ptr, len) + + tx_head[handle] := (tx_head[handle] + len) & txbuffer_mask[handle] + + return len + +PUB writeData(user_handle, ptr, len) | handle +'' Writes data to the specified socket +'' Will block until all data is queued to be sent + + _handleConvert(user_handle, @handle) + + repeat while len > txbuffer_mask[handle] + repeat while writeDataNonBlocking(user_handle, ptr, txbuffer_mask[handle]) < 0 + ifnot isConnected(user_handle) + abort ERRSOCKETCLOSED + len -= txbuffer_mask[handle] + ptr += txbuffer_mask[handle] + + repeat while writeDataNonBlocking(user_handle, ptr, len) < 0 + ifnot isConnected(user_handle) + abort ERRSOCKETCLOSED + +PUB writeByteNonBlocking(user_handle, txbyte) | handle, ptr +'' Writes a byte to the specified socket +'' Will not block (returns RETBUFFERFULL if no buffer space available) + + _handleConvert(user_handle, @handle) + + ifnot (tx_tail[handle] <> (tx_head[handle] + 1) & txbuffer_mask[handle]) + return RETBUFFERFULL + + ptr := tx_bufferptr[handle] + BYTE[ptr][tx_head[handle]] := txbyte + tx_head[handle] := (tx_head[handle] + 1) & txbuffer_mask[handle] + + return txbyte + +PUB writeByte(user_handle, txbyte) | handle +'' Write a byte to the specified socket +'' Will block until space is available for byte to be sent + + _handleConvert(user_handle, @handle) + + repeat while writeByteNonBlocking(user_handle, txbyte) < 0 + ifnot isConnected(user_handle) + abort ERRSOCKETCLOSED + +PUB resetBuffers(user_handle) | handle +'' Resets send/receive buffers for the specified socket + + _handleConvert(user_handle, @handle) + + rx_tail[handle] := rx_head[handle] + tx_head[handle] := tx_tail[handle] + +PUB flush(user_handle) | handle +'' Flushes the send buffer (waits till the buffer is empty) +'' Will block until all tx data is sent + + _handleConvert(user_handle, @handle) + + repeat while isConnected(user_handle) AND tx_tail[handle] <> tx_head[handle] + +PUB getSocketState(user_handle) | handle +'' Gets the socket state (internal state numbers) +'' You can include driver_socket in any object and use the S... state constants for comparison + + _handleConvert(user_handle, @handle) + + return bConState[handle] + +PUB getReceiveBufferCount(user_handle) | handle +'' Returns the number of bytes in the receive buffer + + _handleConvert(user_handle, @handle) + + return (rx_head[handle] - rx_tail[handle]) & rxbuffer_mask[handle] + +CON + '****************************************************************** + '* TCP Flags + '****************************************************************** + TCP_FIN = 1 + TCP_SYN = 2 + TCP_RST = 4 + TCP_PSH = 8 + TCP_ACK = 16 + TCP_URG = 32 + TCP_ECE = 64 + TCP_CWR = 128 + '****************************************************************** + '* Ethernet Header Layout + '****************************************************************** + enetpacketDest0 = $00 'destination mac address + enetpacketDest1 = $01 + enetpacketDest2 = $02 + enetpacketDest3 = $03 + enetpacketDest4 = $04 + enetpacketDest5 = $05 + enetpacketSrc0 = $06 'source mac address + enetpacketSrc1 = $07 + enetpacketSrc2 = $08 + enetpacketSrc3 = $09 + enetpacketSrc4 = $0A + enetpacketSrc5 = $0B + enetpacketType0 = $0C 'type/length field + enetpacketType1 = $0D + enetpacketData = $0E 'IP data area begins here + '****************************************************************** + '* ARP Layout + '****************************************************************** + arp_hwtype = $0E + arp_prtype = $10 + arp_hwlen = $12 + arp_prlen = $13 + arp_op = $14 + arp_shaddr = $16 'arp source mac address + arp_sipaddr = $1C 'arp source ip address + arp_thaddr = $20 'arp target mac address + arp_tipaddr = $26 'arp target ip address + '****************************************************************** + '* IP Header Layout + '****************************************************************** + ip_vers_len = $0E 'IP version and header length 1a19 + ip_tos = $0F 'IP type of service + ip_pktlen = $10 'packet length + ip_id = $12 'datagram id + ip_frag_offset = $14 'fragment offset + ip_ttl = $16 'time to live + ip_proto = $17 'protocol (ICMP=1, TCP=6, UDP=11) + ip_hdr_cksum = $18 'header checksum 1a23 + ip_srcaddr = $1A 'IP address of source + ip_destaddr = $1E 'IP addess of destination + ip_data = $22 'IP data area + '****************************************************************** + '* TCP Header Layout + '****************************************************************** + TCP_srcport = $22 'TCP source port + TCP_destport = $24 'TCP destination port + TCP_seqnum = $26 'sequence number + TCP_acknum = $2A 'acknowledgement number + TCP_hdrlen = $2E '4-bit header len (upper 4 bits) + TCP_hdrflags = $2F 'TCP flags + TCP_window = $30 'window size + TCP_cksum = $32 'TCP checksum + TCP_urgentptr = $34 'urgent pointer + TCP_data = $36 'option/data + '****************************************************************** + '* IP Protocol Types + '****************************************************************** + PROT_ICMP = $01 + PROT_TCP = $06 + PROT_UDP = $11 + '****************************************************************** + '* ICMP Header + '****************************************************************** + ICMP_type = ip_data + ICMP_code = ICMP_type+1 + ICMP_cksum = ICMP_code+1 + ICMP_id = ICMP_cksum+2 + ICMP_seqnum = ICMP_id+2 + ICMP_data = ICMP_seqnum+2 + '****************************************************************** + '* UDP Header + '****************************************************************** + UDP_srcport = ip_data + UDP_destport = UDP_srcport+2 + UDP_len = UDP_destport+2 + UDP_cksum = UDP_len+2 + UDP_data = UDP_cksum+2 + '****************************************************************** + '* DHCP Message + '****************************************************************** + DHCP_op = UDP_data + DHCP_htype = DHCP_op+1 + DHCP_hlen = DHCP_htype+1 + DHCP_hops = DHCP_hlen+1 + DHCP_xid = DHCP_hops+1 + DHCP_secs = DHCP_xid+4 + DHCP_flags = DHCP_secs+2 + DHCP_ciaddr = DHCP_flags+2 + DHCP_yiaddr = DHCP_ciaddr+4 + DHCP_siaddr = DHCP_yiaddr+4 + DHCP_giaddr = DHCP_siaddr+4 + DHCP_chaddr = DHCP_giaddr+4 + DHCP_sname = DHCP_chaddr+16 + DHCP_file = DHCP_sname+64 + DHCP_options = DHCP_file+128 + DHCP_message_end = DHCP_options+312 diff --git a/lib/bel-vga.spin b/lib/bel-vga.spin index bd9321d64adf629901a1ff0f72dbea7ffcf022ae..8beec4d054dceb79d07c34cc1ea421e3c7574e82 100644 GIT binary patch delta 378 zcmbQRf%(ra<_$MECST!D682!QVlZK_VDM(}V5nkHU4N1poRFJ*i;HLS0UiS|Uys{_(HJOeIQaml$mBljvor z%T4kTnQU;FW3n9&52GbeP#>(JkH>`36wFKL;Ff#V@ in<9Ig!IZ&#@=p$FBE4?3S(r1Dg-A<{HmCEhJOu!U{#hUZ delta 31 pcmV+)0O0@px&x4~1F+Z#liUa%lMV?UlQ267vs?~P1hd!@q{`4)3~T@Z diff --git a/lib/fm-con.spin b/lib/fm-con.spin index 440d4b0..06f31b0 100644 --- a/lib/fm-con.spin +++ b/lib/fm-con.spin @@ -52,9 +52,6 @@ FL_SEL = %0000_0001 'eintrag ist selektiert FL_FOCUS = %0000_0001 'box ist selektiert -DR_SD = 0 -DR_RAM = 1 -DR_BLK = 2 PUB dummy diff --git a/lib/glob-con.spin b/lib/glob-con.spin index d8116e9ec36337c0aa6d6a2367650b76c1dd1110..054c660b6ab498a9aa7cc7eb3d85da7b045822b1 100644 GIT binary patch delta 2660 zcmbVO-A`L(7=OA^7&08ylx`BzQ%gNmS4%qyki`YYu_V&a`%_

>^kZ0wn3MDQJ|Dm5_k6tPyDu*M z_Wgw~-x~^;RHg!L(mp+=U8>R`y+CQo(hhxqw=A9w9B<r*D>DNGp(sMQ*D zi?ET$^?BV4>^617G;vB-R!gw*q>HZDs==T38>W!x^25~SsR}Tbv1Z^}qKbM7(QCld z>09fETl(RqzO$SDjg#ci@ic!Gyv1)uZu2MiuJT8bUvV$H7io@`*fH$liA1k^ z3V~jStUl79U8IYYg#9#C;5l*4dR88nfTu=v75)?cJ#=lbEnlKCACDzmB9CX-{D-td zOV4Ayh+~s7{L^YIlvc^l;e8ut5vkpTwnP<2qSx?NK?Fi<7LrBE@h@J}^1P^`t?^U; zeU8U_BVtQf*;Ml9un8SOCuNwSZT3uzdNkT~e9a@KCh8R4c3{6myWr>Mf(dNM5+vmN z4(@{fp+X?V(nQoH4y@LNXR3)mE24SeC?V^K@faWO_KcjxLwzh@X|2!$FqUUq?qL;>6adl}qt^2kWR8wyng1`nhda zD)C>ez&25MKI|KmfCG&szRoy z>c*gV(3Okmx&`UclfwOP2JCTsc)+1YE{{wXFB%ndtkta2sxmwG;eMBo{82ufyzJ6n z0@gG&khlt5=h;2(9nfocK}-QpbN>yIb7)HuMcfLm zITY3MKnan`K2f0nAEllAL(;G$lV?i4%s+?52DQzOk>+miA$j2gSaV2|v~a5#FG7ny zTl4d?V0g5cUv*U z^-z;B%YVd%d?na6R7ve&B?B~F8h|~odyqA$70uQhWjTF4Hlwp36;j2~Y}qXAr74K& z(tDgV@D}}r$n?I4Oz@8(7k@oG#Gk&q;f$bkV`zXoIM*nOc3GgLYz-IhQHewE&+)A7 z>byyK0}pykN^8hqe5@)o4feJ7akcO6V{IC1GIR}W0UC#2Z1%^YB?t>@JkHiHC0k!q z^yjlF{}l#!F%Ux$mUSg4PqsKRlLYolJR9weO4Fa$w)_KhwcW4t(B|hQ_~>!#INNNW zVvI`%Ug?oOtsUp|lCRH11UG03UFA1TaIXhn+lFRGYFkFphr%;AhMkhRfNV$-bxo=k zNCV)y0=CQe-s(5hjEurPP9#VAMPnaQvhk@tpHw{xZON`WN4Ok4qz7GiX>yjIQ& IvruuKJ@{c0!2kdN diff --git a/lib/glob-led-engine.spin b/lib/glob-led-engine.spin new file mode 100644 index 0000000..b93a494 --- /dev/null +++ b/lib/glob-led-engine.spin @@ -0,0 +1,100 @@ +{{ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// E555 Light Emitting Diode Engine +// +// Author: Kwabena W. Agyeman +// Updated: 7/27/2010 +// Designed For: P8X32A +// Version: 1.1 +// +// Copyright (c) 2010 Kwabena W. Agyeman +// See end of file for terms of use. +// +// Update History: +// +// v1.0 - Original release - 1/26/2010. +// v1.1 - Added support for variable pin assignments - 7/27/2010. +// +// For each included copy of this object only one spin interpreter should access it at a time. +// +// Nyamekye, +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LED Circuit: +// +// LEDPinNumber --- LED Driver (Active High). +// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +}} + +PUB LEDFrequency(newFrequency, LEDPinNumber) '' 11 Stack Longs + +'' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +'' // Changes the light emitting diode frequency using the SPIN interpreter's counters. Brightness will be set to zero. +'' // +'' // NewFrequency - The new frequency. Between 0 Hz and 80MHz @ 80MHz. -1 to reset the pin and counter modules. +'' // LEDPinNumber - Pin to use to drive the LED circuit. Between 0 and 31. +'' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + LEDSetup((newFrequency <> -1), LEDPinNumber, true) + + newFrequency := ((newFrequency <# clkfreq) #> 0) + + result := 1 + repeat 32 + + newFrequency <<= 1 + result <-= 1 + if(newFrequency => clkfreq) + newFrequency -= clkfreq + result += 1 + + frqa := result~ + +PUB LEDBrightness(newBrightness, LEDPinNumber) '' 11 Stack Longs + +'' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +'' // Changes the light emitting diode brightness using the SPIN interpreter's counters. Frequency will be set to zero. +'' // +'' // NewBrightness - The new brightness. Between 0% and 100%. -1 to reset the pin and counter modules. +'' // LEDPinNumber - Pin to use to drive the LED circuit. Between 0 and 31. +'' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + LEDSetup((newBrightness <> -1), LEDPinNumber, false) + + frqb := (((newBrightness <# 100) #> 0) * constant(posx / 50)) + +PRI LEDSetup(activeOrInactive, LEDPinNumber, frequencyOrBrightness) ' 6 Stack Longs + + LEDPinNumber := ((LEDPinNumber <# 31) #> 0) + + dira[LEDPinNumber] := activeOrInactive + outa[LEDPinNumber] := false + + ctra := (((constant(%0_0100 << 26) + LEDPinNumber) & activeOrInactive) & frequencyOrBrightness) + ctrb := (((constant(%0_0110 << 26) + LEDPinNumber) & activeOrInactive) & (not(frequencyOrBrightness))) + + spr[2 - frequencyOrBrightness] := 0 + spr[10 - frequencyOrBrightness] := 0 + spr[12 - frequencyOrBrightness] := 0 + +{{ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +// Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +}} \ No newline at end of file diff --git a/lib/gui-dlbox.spin b/lib/gui-dlbox.spin index b1da091e04295bb78d8c2299852c70369b27fb70..d837cef9015272a421a49645d9eec3c02691adae 100644 GIT binary patch delta 803 zcmd5(!AiqG6r59`0kxr4C`DcH&_q*;UZjEt!Fp2hrngdK#7K-1l~xfv`T=|J<~Ioa z0zX7geup@l&9l9D@g!k+Z{N($&Q4wqz7AhMN-c#QL`ZRs8`ca87l_#_Y@?sgVkDg8 z_~^YfaJnh3aLIv>2Ugn$qyz}LPgpb70jA*OOHoXCrZ?Y)UaeL2LfO&h?rcXCs`m#~K|9Feh$F7`QJ z;aby+)Ad?Nj~TO#==@G}4KhE8m^7>--}={Y)w=$yR35FCxDTi+y=9KGvUx;g*i`?X bmHe0AvKr(6DyxRgO5B;Or1wY9?$g{i49AQ{ delta 41 scmewtJ}+RyJ+{p}>}6c61q}HN#gpfYicfwe$Oq-si_33r60H#f06n4&>Hq)$ diff --git a/lib/gui-input.spin b/lib/gui-input.spin index 6833922bc8929053eb7466f5938f891cb12d5ce4..1a3941c33d5ce296deabccff5f85f7f6e6ce4628 100644 GIT binary patch delta 54 zcmaE0+hw=m9-F2DgDXQOLmopqLn1>GLn=cGkeA4i!;lXYQD6vWC}Ajq$Zx*O#w-B< Dg`f>4 delta 12 TcmeCOdtkfa9@}OPb|wh`BbfwN diff --git a/lib/gui-pbar.spin b/lib/gui-pbar.spin index fd55f07399d0ba5d6fdf66ec9a494217c8eccefd..5773ea14a864433cbeb18ac1acdd843008bcbed5 100644 GIT binary patch delta 80 zcmeBkz2v -FfQgC|2CLmERqLkdGCLn1>Ckd@A$z>o{%l>lisAioI6DrQJ#$N;iH Uq99%pSZy{#Dns7pyKEb!0TyZ#MgRZ+ delta 16 YcmccQ+UL6A9^2$O>|C35*q2EI06wV(W&i*H diff --git a/lib/gui-wbox.spin b/lib/gui-wbox.spin index 3eeb16747df554e2cf83658bbbeb8c5d3a30fe11..9c46e3e44a483d6080f334d51c9c91967ec24963 100644 GIT binary patch delta 257 zcmbQ>^2Ke#JvMU%hH!>Nh9ZVMh7^WOAS;I+J_ML;E147NbhXfivWym|WJ5EXF7_xrU!_vJRigWDzJkj}NGTUu5z!evM56CBgvV Cq!5?@ diff --git a/lib/m-glob-con.spin b/lib/m-glob-con.spin index 2092455be89f63a42771d0475ee48c171724feee..6c54049047f01b5bd39ed3031b84a9684e86c5b0 100644 GIT binary patch delta 602 zcmaKozfQtX6vodbp+*xUwjfe5_EyEg#3+A48I1Y_u5N|^MI!=&fz(B3CzG={xX9>W zG+lM^8H|Yz&TbkXz<7FZEwGs8w!QcFedm7XJfE|x3wHNC;r=X?LwKV^T_w_tV9(H5 z8Xt{id@$6JB9x&7dw9<^{4i8ZaUG*v#dlM|9UjF^T4#J3YkUfCXTgY;*l!YdvK>C8R*yLS6{0FG#5l~J;MQAdg rip1m~6_LqSDpHdhfc!Kdy+-8|P%qo&42^w^n?LcVFm2Y-`XmbgP0ufl diff --git a/lib/reg-ios.spin b/lib/reg-ios.spin index eaa424de7768ae4e7a7e227e6858d76fd6f5d204..f797535d1670cc8265da46a62967afd464c00285 100644 GIT binary patch delta 9151 zcmb_idvH`&89(=K9y|ghB%2I|z=nrO+61zMf=~m505OG>Jitm3>4rQ=6Y|(3Bw(i` zoz`~v1Hm(JsxWF~T5EL_tPUfcVH(?EXoV{O=nNKHI-RzE*hj{y@)C44$t|)jZ_H`MSb;#452%>=fO6x_1i%a z7TucaHt^dnHfk?>{dU$&sU&cT5V04PK#2b0TEJt zC+%8UUzR(|3=5dYA}p((-s;0Z*>@^mzV*%W{QI>r4nhqo(+Q560RA43Th{v2aea`Z`o}a0H*=XnN3u1n&rZWU_=$cjt6%fU^h5&`V z_`3t<>xX+h0_%|hfG-4yQIY|SBLHdaX2<=6W*GNPR1vf~Rn?1jzG_bOzT=m#Hy)1B*9U#&+86JcVFV@H9?`3gEwGCK zb)#@ma)rHOchCTGY??nkpwSXmcmK$mzl*4-2k_QIBg0@fbn3z2Zs@rO%!;9RFEnkz zC#)?I#+!W_e64uXqwQ3p!)hX@wL`S1tH-T;xo%&1MD_ZyWgUoK9UDY02NSi7 zw0cn{zKXlBHZ|W2;(a^b{sZyYrUf!i+y~-xO_LtIUta@=XzyImmVK{mZrT8m0y=_? z+uAUS;3C(0a3E##rdVf|Ht-*gn4r{oHsE)40?o6 zhvs7CG>hG!JqR8{8U!tnA{jKixzLr(0f-ou$c2Zz)R~CPrwqS*vtLj`7l8C0 zR|G=RXy2m8bwiFGJ&r)8orxTRw^c(k2Rf;vZE)wM;I2($T<0Y>Z`nsIZ z*_=$706RLB`o%YW3oC*!LNZOFD?)-?GNghPZZ_b;Wdf!flw8ek zGv1NhtLr1iY7_s4C@$`a^xMnt>V5!gMLChjBP4XMY9a;6uiJa_g6ZBp_CG__!Rb-aZ?L#{u$A~JotC}mn=$u{ib#%mDUcME}Gx@724+|PXl@2nI!PSXNI?EvbMu{^|mg5N> z8^j8|Qk1BwQ+8fD`<*aCG+L*uWS!EK=%UY-47>({>#Gv!-pb|4LcKE97Y04lZ5z~y z=HQzIy5A!h<~bB-6Mva8qRFsPZzLEHlMo{^G`K?stc*i$6}b@o=SB#!9?ifed^YO) zI@HM9#170Uh7*FK1b;;x7%z4-_E?oNB8i?jOW-LhGpf56tzdLtE3N>k{|pw?+^zix0UH8Ou!^YCp#Q2HtZyL

u-n;Z#Ei9rsH z2(LQ$as%GFWn+HBJfrjwY}@9lV1RuWKX~B7;23idpVSlu8j3sx-`l(fHImNHtssni3m$PW6&Wf>%f_A3cd9lCbOFBlpU~(HTSG4nDZda zyBE?XpP;e|tsQcI-CR9khv`^N=|rotpl83u>CC4c_}zqG5+pcW^ck$Sp!uLMT|itM zw$#|LukcXRon~=M=FTp(%l$g(5)2GnHhmOX|$FlL~D|nbcT-f*uY)-e+I6n z2jAvF@A!4AXoe|k9Nem_%>?Qj87^|=jcx)rM~+-vAlF~bB|=@KZoeI*dKa%`3)9Uj zypapmvO*e@sUa~La0Nq_QWHP6^JbWWLR$-U;^=FB`HfH3#g%jgoDr=En3hc5Tf{0t z7i-yi3ri<9GVMe*>Xugbo2ov?PP591%)1k!9gBu{+3+aMQv43pV>hX$<|MDCJe5=E z^Hfe7kx6@XV&;0yy*uwtB(a0E5?31;*s>`oN;H=@i$`nw&tC?yNJwbqk`_cs_XN-> z_CIUI^m1F>la5&Acy}P9d$|lt(=>53EpE;hJm(zj0SuIagi!d%2;VlQSWZ{ zEg|8<>a{U@gIagoPCIegnx?ugT2uV-#I&wpZOEEuIMlypJ)Jl|M>U?e z0Kg0@MA9=&+0c`XC1Dtb8B~2c?AIMSVHh?1plaCe^G`Ro+NN@RXcuW7HU>@xY#b2A;XU(v2QHfFng*w7WLk7oP)>hhSqUS+2Hreqlrc&6%X zM5>8WU!Gbw43~^#`%+~2$wldAP%U>Yi_*E1A4XX?`YU^>98t5iUxpzej}nT(RG%}+ zEAKT?AMAV@eO&URPxZxk{eXB^FdB#ptA3kHxo^N<_QHs#k zOBB(FoTbLca7YP8i(N*fQie4xx{mWml6Qcv44ul8t1p*2jH}hv$4sm_%=`Xmm03~U z3JrI*WUL*zv0`@P+d&RSF#K!CKilQ+_?)g$g;#L4nUmqmr5PPt*JxsmB&I?)th-Y+ zrHDBlg;_EsV_6ErYJDf?xBqYUY}NY-3Tr6pFl~xs>I2g_OFOXPSwZyZw;+m-4s77; zfo0jvvLWfgrq`dJm_uAUQ+c)-Qr{l4^HTLRo}|(=NOcAS2_)p&t~@pOhyjC{q;|Di z`PdcboFUkl+s)i&G*!p|Z4UN4x3yBNnmO_EMfyc`>=^QnYlazS+yjQ7-l0%Gf5x6d zjHOLw*3>k)$?1@!w+SVpjt5nauj}NzhP1p`g`zyOGJN<)h?9#Vf!?Zq@VIX=lR4r> zlZkhm2&lQK}v`LK&ihE3CzSmk85(j9O*J z0tQ!Rl*^KLY@SLT5rANM^}T!PI_%;OtMO&N>>}2F?!cvPvcNOfQhR*{_{b8JBD*-ggMH*Bt*F{*%^uE z`}Cw}+`=-32TL)XBkHhQHdC$pr=5}=B^Mb5i)O1=3as)O^`40(YV4d{sqQ;%PgCDN zZPz1dkg7uuvd#C(W?s@r%`gg;Y**t2Rz7^(K5caa?^-9&d#m-e1*4xGM{n4C4dY`>Hw`92vFeZ$k>t=4(7B%qAZ)owwP}#VOuUfdK^784?+?8A=#R8B!T?fH0Mz7${l_ zBvToR7*ZHAfusTur!tgGKiI`2JAIxYqr!BKN+y}<3$hvcCO=p#G<{74lh|g9B@X+T zc^SB-e_Y61xm{urBU{?^MI1~SAi`|=5l$wz={DU=9Me~EFd0oh#Kn{ck?`SV5}2-I z%_KMd!5>D2sWnVW)9e^Ira$0h;+x*U!z2V&wH>I+N^AQOZ>B2$_GxpNwojYG{3aOy D5!OTH diff --git a/make.bat b/make.bat index 0d0f944..10b48ee 100644 --- a/make.bat +++ b/make.bat @@ -54,6 +54,7 @@ REM htxt, g0key %BSTC% -L %libpath% -b -O a .\system\administra\admsid\admsid.spin %BSTC% -L %libpath% -b -O a .\system\administra\admay\admay.spin +%BSTC% -L %libpath% -b -O a .\system\administra\admnet\admnet.spin rename *.binary *.adm %BSTC% -L %libpath% -b -O a .\system\bellatrix\bel-htext\htext.spin diff --git a/make.log b/make.log index 8b1c461..bc36ba2 100644 --- a/make.log +++ b/make.log @@ -1,9 +1,9 @@ H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>date /T -10.05.2013 +21.06.2014 H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>time /T -20:53 +18:38 H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>REM Pfade @@ -43,10 +43,11 @@ Loading Object adm-hss Loading Object adm-wav Loading Object adm-rtc Loading Object adm-com +Loading Object adm-plx Loading Object glob-con -Program size is 13400 longs +Program size is 14352 longs 2 Constants folded -Compiled 2950 Lines of Code in 0,275 Seconds +Compiled 3179 Lines of Code in 1,759 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>copy admflash.binary ".\bin\flash" 1 Datei(en) kopiert. @@ -67,7 +68,7 @@ Loading Object bel-bus Loading Object glob-con Program size is 7620 longs 25 Constants folded -Compiled 1589 Lines of Code in 0,153 Seconds +Compiled 1625 Lines of Code in 0,679 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>copy belflash.binary ".\bin\flash" 1 Datei(en) kopiert. @@ -88,7 +89,7 @@ Loading Object bel-bus Loading Object glob-con Program size is 7660 longs 27 Constants folded -Compiled 1644 Lines of Code in 0,124 Seconds +Compiled 1680 Lines of Code in 0,669 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>rename belflash.binary tv.bel @@ -100,7 +101,7 @@ Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object regflash Program size is 32580 longs -Compiled 694 Lines of Code in 0,174 Seconds +Compiled 693 Lines of Code in 0,179 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>move regflash.binary ".\bin\flash" 1 Datei(en) verschoben. @@ -120,9 +121,9 @@ Loading Object regime Loading Object reg-ios Loading Object glob-con Loading Object glob-string -Program size is 9736 longs +Program size is 9868 longs 2 Constants folded -Compiled 2694 Lines of Code in 0,152 Seconds +Compiled 2868 Lines of Code in 0,739 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>rename regime.binary reg.sys @@ -146,7 +147,7 @@ Loading Object adm-rtc.spin Loading Object adm-sid Loading Object glob-con Program size is 12112 longs -Compiled 2486 Lines of Code in 0,19 Seconds +Compiled 2522 Lines of Code in 1,519 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\administra\admay\admay.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -157,7 +158,24 @@ Loading Object adm-rtc.spin Loading Object adm-ay Loading Object glob-con Program size is 8344 longs -Compiled 1975 Lines of Code in 0,129 Seconds +Compiled 2011 Lines of Code in 0,82 Seconds + +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\administra\admnet\admnet.spin +Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved +Compiled for i386 Win32 at 08:17:48 on 2009/07/20 +Loading Object admnet +Loading Object adm-fat +Loading Object adm-rtc.spin +Loading Object adm-hss +Loading Object adm-rtc +Loading Object adm-com +Loading Object adm-socket +Loading Object adm-enc28j60 +Loading Object glob-con +Loading Object glob-numbers +Program size is 21952 longs +4 Constants folded +Compiled 4722 Lines of Code in 1,789 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>rename *.binary *.adm @@ -169,7 +187,7 @@ Loading Object bel-htext Loading Object bel-keyb Program size is 6656 longs 12 Constants folded -Compiled 958 Lines of Code in 0,098 Seconds +Compiled 958 Lines of Code in 0,119 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\bellatrix\bel-g0\g0key.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -179,14 +197,15 @@ Loading Object bel-tv Loading Object glob-con Program size is 7156 longs 1 Constants folded -Compiled 2130 Lines of Code in 0,105 Seconds +Compiled 2166 Lines of Code in 0,529 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>rename *.binary *.bel H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>move *.adm ".\bin\sdcard\system" H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\admay.adm +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\admnet.adm H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\admsid.adm - 2 Datei(en) verschoben. + 3 Datei(en) verschoben. H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>move *.bel ".\bin\sdcard\system" H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\g0key.bel @@ -212,9 +231,9 @@ Loading Object admtest Loading Object reg-ios Loading Object glob-con Loading Object glob-string -Program size is 8204 longs -1 Constants folded -Compiled 2504 Lines of Code in 0,119 Seconds +Program size is 8616 longs +2 Constants folded +Compiled 2666 Lines of Code in 0,139 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\beltest.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -223,9 +242,9 @@ Loading Object beltest Loading Object reg-ios Loading Object glob-con Loading Object glob-string -Program size is 6380 longs -5 Constants folded -Compiled 2384 Lines of Code in 0,105 Seconds +Program size is 6792 longs +6 Constants folded +Compiled 2546 Lines of Code in 0,74 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\charmap.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -233,9 +252,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object charmap Loading Object reg-ios Loading Object glob-con -Program size is 2252 longs -1 Constants folded -Compiled 1813 Lines of Code in 0,061 Seconds +Program size is 2664 longs +2 Constants folded +Compiled 1975 Lines of Code in 0,5 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\eram.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -244,9 +263,9 @@ Loading Object eram Loading Object glob-numbers Loading Object reg-ios Loading Object glob-con -Program size is 7348 longs +Program size is 7364 longs 2 Constants folded -Compiled 2775 Lines of Code in 0,129 Seconds +Compiled 2937 Lines of Code in 0,23 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\flash.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -256,9 +275,9 @@ Loading Object reg-ios Loading Object glob-con Loading Object glob-sdspi Loading Object glob-numbers -Program size is 7144 longs -7 Constants folded -Compiled 3188 Lines of Code in 0,131 Seconds +Program size is 7556 longs +8 Constants folded +Compiled 3350 Lines of Code in 0,889 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\fm.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -272,9 +291,9 @@ Loading Object gui-pbar Loading Object gui-wbox Loading Object gui-input Loading Object glob-string -Program size is 7640 longs -19 Constants folded -Compiled 2612 Lines of Code in 0,177 Seconds +Program size is 8276 longs +22 Constants folded +Compiled 2833 Lines of Code in 0,79 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\fterm.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -283,9 +302,21 @@ Loading Object fterm Loading Object reg-ios Loading Object glob-con Loading Object glob-fds -Program size is 2656 longs -1 Constants folded -Compiled 1993 Lines of Code in 0,08 Seconds +Program size is 3068 longs +2 Constants folded +Compiled 2155 Lines of Code in 0,719 Seconds + +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\ftp.spin +Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved +Compiled for i386 Win32 at 08:17:48 on 2009/07/20 +Loading Object ftp +Loading Object reg-ios +Loading Object glob-con +Loading Object glob-string +Loading Object glob-numbers +Program size is 7444 longs +8 Constants folded +Compiled 2900 Lines of Code in 0,839 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\g0test.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -293,9 +324,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object g0test Loading Object reg-ios Loading Object glob-con -Program size is 5984 longs -39 Constants folded -Compiled 2302 Lines of Code in 0,091 Seconds +Program size is 6396 longs +40 Constants folded +Compiled 2464 Lines of Code in 0,32 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\hplay.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -303,9 +334,34 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object hplay Loading Object reg-ios Loading Object glob-con -Program size is 3992 longs -9 Constants folded -Compiled 2054 Lines of Code in 0,08 Seconds +Program size is 4404 longs +10 Constants folded +Compiled 2216 Lines of Code in 0,44 Seconds + +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\ipconfig.spin +Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved +Compiled for i386 Win32 at 08:17:48 on 2009/07/20 +Loading Object ipconfig +Loading Object reg-ios +Loading Object glob-con +Loading Object glob-string +Loading Object glob-numbers +Program size is 4992 longs +8 Constants folded +Compiled 2742 Lines of Code in 0,86 Seconds + +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\irc.spin +Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved +Compiled for i386 Win32 at 08:17:48 on 2009/07/20 +Loading Object irc +Loading Object reg-ios +Loading Object glob-con +Loading Object glob-string +Loading Object glob-numbers +Loading Object glob-led-engine +Program size is 13840 longs +14 Constants folded +Compiled 3777 Lines of Code in 1,02 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\keycode.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -313,9 +369,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object keycode Loading Object reg-ios Loading Object glob-con -Program size is 2180 longs -1 Constants folded -Compiled 1816 Lines of Code in 0,062 Seconds +Program size is 2592 longs +2 Constants folded +Compiled 1978 Lines of Code in 0,52 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\m.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -324,9 +380,9 @@ Loading Object m Loading Object reg-ios Loading Object glob-con Loading Object m-glob-con -Program size is 3360 longs -1 Constants folded -Compiled 2133 Lines of Code in 0,089 Seconds +Program size is 3772 longs +2 Constants folded +Compiled 2311 Lines of Code in 0,109 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\man.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -335,9 +391,20 @@ Loading Object man Loading Object reg-ios Loading Object glob-con Loading Object glob-string -Program size is 2716 longs -1 Constants folded -Compiled 1997 Lines of Code in 0,078 Seconds +Program size is 3152 longs +2 Constants folded +Compiled 2161 Lines of Code in 0,73 Seconds + +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\perplex.spin +Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved +Compiled for i386 Win32 at 08:17:48 on 2009/07/20 +Loading Object perplex +Loading Object reg-ios +Loading Object glob-con +Loading Object glob-numbers +Program size is 6160 longs +3 Constants folded +Compiled 2771 Lines of Code in 0,809 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\ramtest.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -345,9 +412,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object ramtest Loading Object reg-ios Loading Object glob-con -Program size is 4272 longs -35 Constants folded -Compiled 2069 Lines of Code in 0,08 Seconds +Program size is 4664 longs +36 Constants folded +Compiled 2230 Lines of Code in 0,52 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\regime.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -356,9 +423,9 @@ Loading Object regime Loading Object reg-ios Loading Object glob-con Loading Object glob-string -Program size is 9736 longs +Program size is 9868 longs 2 Constants folded -Compiled 2694 Lines of Code in 0,122 Seconds +Compiled 2868 Lines of Code in 0,579 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\rom.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -367,9 +434,9 @@ Loading Object rom Loading Object reg-ios Loading Object glob-con Loading Object glob-sdspi -Program size is 4364 longs -4 Constants folded -Compiled 2429 Lines of Code in 0,088 Seconds +Program size is 4776 longs +5 Constants folded +Compiled 2591 Lines of Code in 0,5 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\sfxtool.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -379,9 +446,9 @@ Loading Object reg-ios Loading Object glob-con Loading Object glob-numbers Loading Object glob-string -Program size is 6644 longs -1 Constants folded -Compiled 2756 Lines of Code in 0,119 Seconds +Program size is 7056 longs +2 Constants folded +Compiled 2918 Lines of Code in 0,809 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\splay.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -389,9 +456,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object splay Loading Object reg-ios Loading Object glob-con -Program size is 3064 longs -1 Constants folded -Compiled 1925 Lines of Code in 0,071 Seconds +Program size is 3476 longs +2 Constants folded +Compiled 2087 Lines of Code in 0,529 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\sysconf.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -399,9 +466,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object sysconf Loading Object reg-ios Loading Object glob-con -Program size is 4228 longs -2 Constants folded -Compiled 2046 Lines of Code in 0,078 Seconds +Program size is 4640 longs +3 Constants folded +Compiled 2208 Lines of Code in 0,17 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\tapecut.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -411,9 +478,9 @@ Loading Object reg-ios Loading Object glob-con Loading Object glob-numbers Loading Object m-glob-con -Program size is 3560 longs -1 Constants folded -Compiled 2516 Lines of Code in 0,096 Seconds +Program size is 3972 longs +2 Constants folded +Compiled 2694 Lines of Code in 0,8 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\time.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -423,9 +490,9 @@ Loading Object reg-ios Loading Object glob-con Loading Object glob-string Loading Object glob-numbers -Program size is 5804 longs -1 Constants folded -Compiled 2591 Lines of Code in 0,112 Seconds +Program size is 6216 longs +2 Constants folded +Compiled 2753 Lines of Code in 0,639 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\wplay.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -433,9 +500,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object wplay Loading Object reg-ios Loading Object glob-con -Program size is 3348 longs -1 Constants folded -Compiled 1947 Lines of Code in 0,074 Seconds +Program size is 3760 longs +2 Constants folded +Compiled 2109 Lines of Code in 0,52 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>bstc.exe -L ".\lib" -b -O a .\system\regnatix\yplay.spin Brads Spin Tool Compiler v0.15.3 - Copyright 2008,2009 All rights reserved @@ -443,9 +510,9 @@ Compiled for i386 Win32 at 08:17:48 on 2009/07/20 Loading Object yplay Loading Object reg-ios Loading Object glob-con -Program size is 3348 longs -1 Constants folded -Compiled 1995 Lines of Code in 0,082 Seconds +Program size is 3760 longs +2 Constants folded +Compiled 2157 Lines of Code in 0,52 Seconds H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>rename *.binary *.bin @@ -457,11 +524,15 @@ H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\eram.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\flash.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\fm.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\fterm.bin +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\ftp.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\g0test.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\hplay.bin +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\ipconfig.bin +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\irc.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\keycode.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\m.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\man.bin +H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\perplex.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\ramtest.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\regime.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\rom.bin @@ -472,7 +543,7 @@ H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\tapecut.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\time.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\wplay.bin H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios\yplay.bin - 22 Datei(en) verschoben. + 26 Datei(en) verschoben. H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>copy .\forth\*.* ".\bin\sdcard\system" .\forth\adm.lib @@ -509,6 +580,7 @@ H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>copy .\system\son .\system\sonstiges\error.man .\system\sonstiges\flash.man .\system\sonstiges\fm.man +.\system\sonstiges\ftp.man .\system\sonstiges\GREEN.COL .\system\sonstiges\hplay.man .\system\sonstiges\PAR.COL @@ -519,6 +591,6 @@ H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>copy .\system\son .\system\sonstiges\test2.txt .\system\sonstiges\wplay.man .\system\sonstiges\yplay.man - 18 Datei(en) kopiert. + 19 Datei(en) kopiert. H:\Projekte\Technik\hive 1\software\TriOS\TriOS-SVN\hive-trios>echo off diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..2ad622d --- /dev/null +++ b/readme.txt @@ -0,0 +1,4 @@ + +Informationen zum System und zur Installation im Verzeichnis "doku". + +Informationen zum Projekt: hive-project.de \ No newline at end of file diff --git a/system/administra/admnet/admnet.spin b/system/administra/admnet/admnet.spin new file mode 100644 index 0000000000000000000000000000000000000000..9ee80b98e27ea75ab0b79d34b563590db341cad6 GIT binary patch literal 175486 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≪f)*z-JRpvW6t^9dD`hdTaM=cx@mIt@l>OrFL#V{)kHFovZuWzKLq*3{;jo~*oW|)^=;&YL2o0jRq>%E^c zOPYx)?aN0C*%z09kcAJc-oE<Jj3Cd^NR5s*$v*wZFpuwc@64)6$^R>z~ldj{=+W8mEhgE^Bs$P zz&_uh4DbHE{w_Ia-$y%)tL&@Z#=Jg`@Ap#)<~F~vf86W++O%Ak*J1cbj+@h*`q<8Q zEZX+(&S^y5a1tlp@~-=w`b|#zX!`sqYiWHr?bFws&&WY>qU3{Dtks;i#6xFn|61{s z^P2OPt_Lsbxpn0=g3Y z=Zk4Z>Z;8m-n1)M%psJW}|L@;07fjxLXUYfH4d;6{Lr290=Wbvz zy>5t#B4(QKXEw}d(|PF3yx%j;!dxN0LNlGG>$S+tXY#x6!Tl^f&pxl5#H${jTdSP> zfHx?QkojcII=)Evt4->fRK>)T5A2zjb|3xvUI4rUJ8OeD$5QYy4zE3bO8X4(tFK)KdS(te z37Gx<1r;sR68nezV9+~O*rgzU8V_1K-sdCo-f8op^~D^dQ-Il1QG_{NuuESh4%qFT zJ|9ef1#8SH>pAU}LC^cvHcxY}kAeCdu+DW=aByeHG}oz#y=VIsX-zTkXw{n_Vuusp z4VpvWCMKgDADMW{_y5m1EJn||GIk*ErjYZ2_>38F_950-;dSo~j#7P7jP#ENxz215 zw>urE>0yNI$Ly3;Z55bvn(rq~=(Kp1?~a343B#-I+i`HyI7a$~3K*(hLNA4Uv2O`; z{o-`zaB-P9DY!G&t>sh56I$en^+9b*sRP7)(l35jQ(~yqkklcM$Qdw6GkK0g8fLzP zoiNYfIQ@fHP4RmFj)R*vS9j5{%R0+T=Bs>Xc?Nc>*f7s!$Nr-gzqT5T%T{^7x=YUH zV;>s*{#Me5-z6{SOS|uzpPO-mc-`VX#ei7gK_LbewSyX5kPG_Qzi`FKser=y= zo1HSQ*gJi4A5WaOE8p06K7V1?*joed>Y61fVcua^^Kj10&wr5-ucNh2VO!x+xmA19e|2J~fX;TwC3Z(RMx-mlwz z_=()9lerkjHM{qkwRt1Ge__7^0eC!Nck-LY3+BF^{sQ%Y?~1)*yk`@3pbD#K9kWd= zI1V@|`nrvXe!sBRz$edMF?@poS~zE)@MSMsU+3(dZ!ucY78;$kJFX_&P>IF~o{S@4 zfLhQ5TzG3GPQOdP$6XpXcmiAJ6Gp+6bC%Az=5$T{3SFQ+xc8Aqukb6F=Pq831E|9< z&R*+|Gx5dfMr9hy*p??mS%S6zlEn#ZK`BPCt8`_OT0jMjuz@zZtPc~aVkw(>| a^z84#!GHamju-x0vJ3w<`M1M3`u_r{Wn6Lq literal 0 HcmV?d00001 diff --git a/system/regnatix/fm.spin b/system/regnatix/fm.spin index 6bdf91f8afd53dec351a90b4def2f52698e488fd..8ea759a130cf29a0083fdf5c6b1167de86353ada 100644 GIT binary patch delta 3792 zcmb7HYiwKP8UCCYCw1cF#Ia*1!S#uAuj4kC=7MvNb!-XPOX`5FmaasER-c@dwrjG)+t>tU?T-2=Tn%vE$>E za*=h;cfQN>-Y=h@-!wh-w~}X9%IKvs^DlbEpa_U=u^;bVj6I?cUvZJatWWd{6~6$U zd8}l`3Px3&$<31Dlt>Gkuu5D2*q-m8k^z!w$HZB&Pb`S}ZV;UlCoxTeR2=UGv4}%S zu*x$!fq51`7GZ@BOnOK)RW7nneEy8si?2nIlBhJ^s`#l`20kg4@G$B$XoDHvs{D>) z9LIbGf+T^|6*BTEAfO(dDmzM+^0gi|hVj=fC18$>O=70=h=VShDoGFS_R@N}k4{uL zT+5K;6y#tdus#8xVj@G&mG|+!?JUnA;|ZKvr4P&d{YGB=-7dMXE-}fG^^ZY*P}N+! zJ~Y#W)j_LOz4UfRoil~ayvMQ-ZB8;fSK*@nRQ383fW<&43$h(}&ttwQjV8@3y0E?? z?uQ{e>73%C+3G*pw$;MvG##+k(^bVndz7}Dq;T|BhpW-ZmHoT~&KXDo6VsCwPKmfz zX{*-N*_Hx4M(Nkp1N84+g)UbQ?BMl3XawlbtAlTvM$KOKlGW!B^M*E zFv7~sxq1P z%6AMZX2CaxH#ks@qn3u$DtdOGDRfjZlLe99I8e_)NvZy|(RPFvm%Y=HjvnMi zK_Zdt#?w+0){1rKl{A^U?)0={&hE{-j5`5~FZ&Hu3@nhP>o&T)U)hzA&O}gCjp^=A zqei^52r68RIqVa1x=w>-y7^~vLC=+7-~ zQirXS*wbC8u%@3C6{&f#D!Imx-+C?F+E$CBGa;qrwz|37N$QAu=61QVg$kjHaL&No z{<(oKOZVz@IBWIp)Fgb+qbsK$yLSOy%qPvL@8osoBDfKp%9T`wo*z;;ynBpx-0qIB zA>VcaVhrQX?lm3UF4tg)D(8tk`sgq(8jim+t2kG63NNonX z&PdCzAWB)rP8vMas>KhLn9d)w&6^gB1KR&de!V$!%*~ z45o)!Id-Rh&EtmAE!|cyxbZqx96!1CtX=p?=tji!82BN?wx+{OEGQ%SdrC&19COiU z`|a9n_*G7WZvx*?k~|nU4Lj|PSW0mvrk6dn__mI67VvFjr*8wYF>u{XVSh_jP%hwn zLDy>uC)jf}PFfFl(Upird+LtISg#H^ymFAsRKX}|1hHP8^xDle+-P-f;VBT77b0!! z&IZeQBxs-<~wD}#3`Rv?j+PkSPoWqwB}WHbBc0ML5{gHJ%$ z6co`*N)mfZ`0;HEf57Np6E4kscQ}9h>1G1nVghU`?p%6d;h<+wWaa}ijoB==qQhE$ ze1-+N7j!JU@@CFzl(^MYrgy0UdUC;O)2ooaGKdvd<6%gq|7~JJ7j-=C<%R!Oe+}@s BW-R~! delta 1092 zcmZ`&Ur1DG6hHTRGaYiejdyNW9b&W`|1jxzGf{D8N7DhJKW?i_sTJzXG*XQ+j!u7u zXsZQ@9wvX#Lqsnv3(GD`^!4DvviRVWgtV{^i^OjD5Fz1O^b|34?lk_1W%=NK=R3dO z`JHpVd%g!h$+Q1Tj}qH4SJ2b4pWHM>qZFnjTQM4<5sI=Ep%yA48(DaQy~DhZGVW&H zFpbegY%jclg+de6HWMjZqj+vxR?wt6iq24o;!K`m(Fy!xFR!Vh%QQ)6`8>u*h-Jbo z8fLLAOe-B4)G{0n+pxT|V%HFzW7Z_|&hxUg-s~%ZsRrvOvc52vYN>?Cn^hWR?N2@{ z%O&wjtCG!g$5DpqT^`IhN@pA%G&$PX^x#FMGE>}!TU`zW+;O}N zs+cR^f!^W-T#|}4UBT00KcXcX>{>^5pK7$DvqVMOu;ZGhL(lQNGK|?ZF9M-@xO#AA54#C;EC^AdCBU`!{*J*D(c;x7crU9G}tg zDaOdhMPrk@>deRQM(c*ohb`D|+~4c=0`XUgEQgcy*$<`x^3f^2>{j}MzY)4Xd#RI- zGwW;Ktr>Fj`fpUj|3n?9b~+;dC_AZOrAsZmz%w(+6O+I|`Hu+n=uj)Z$2CJizE2Z_ zdtDMLDubA-OyO;}7pG6!koH{7vxe!bmKr>(iXvm`VyU`75wZOl39|2R_INSf@E-Hk zI+_n^qWZv~giPZ*2BP@0X+e}W8**0TPO4rkw4RVTiH`nM1V{as@zhg`yD2-SzwE`U zb`^4sL%ayMEo}p@I<8}>PshEahWm$H=)Ypymf$AF@y6rC`z}?agV$xGgI+P;{f&&w zv05>I_=zks$4sR-#dj6sfu7*ej`O?Y2Lj3G#Oy?9oqU@dAOGiF1NN5NuUJ{CjIg&B!iSLC(|f$yjyg3+I?cHFpi&V`krD(vTH tC1J*VvRE8%&J*#(xXhhs;&#%nh(Kytk*dVOZ_miWe$y|B+3#NN{0PF>OV9uS diff --git a/system/regnatix/ftp.spin b/system/regnatix/ftp.spin new file mode 100644 index 0000000..cefcfe5 --- /dev/null +++ b/system/regnatix/ftp.spin @@ -0,0 +1,540 @@ +{{ +┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Autor: Jörg Deckert │ +│ Copyright (c) 2013 Jörg Deckert │ +│ See end of file for terms of use. │ +│ Die Nutzungsbedingungen befinden sich am Ende der Datei │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +Informationen : hive-project.de +Kontakt : joergd@bitquell.de +System : TriOS +Name : flash +Chip : Regnatix +Typ : Programm +Version : +Subversion : +Funktion : FTP-Client +Komponenten : - +COG's : - +Logbuch : + +22.12.2013-joergd - erste Version +05.01.2014-joergd - Defaultwerte gesetzt + - Speichern auf SD-Card + - Parameter für Benutzer und Paßwort + +Kommandoliste : + + +Notizen : + + +}} + +OBJ + ios: "reg-ios" + str: "glob-string" + num: "glob-numbers" 'Number Engine + +CON + +_CLKMODE = XTAL1 + PLL16X +_XINFREQ = 5_000_000 + + LANMASK = %00000000_00000000_00000000_00100000 + +CON 'NVRAM Konstanten -------------------------------------------------------------------------- + +#4, NVRAM_IPADDR +#8, NVRAM_IPMASK +#12, NVRAM_IPGW +#16, NVRAM_IPDNS +#20, NVRAM_IPBOOT +#24, NVRAM_HIVE ' 4 Bytes + +DAT + + strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available + +VAR + + long ip_addr + byte parastr[64] + byte remdir[64] + byte filename[64] + byte username[64] + byte password[64] + byte strTemp[128] + byte addrset + byte save2card + byte handleidx_control 'Handle FTP Control Verbindung + byte handleidx_data 'Handle FTP Data Verbindung + +PUB main + + ip_addr := 0 + save2card := FALSE + remdir[0] := 0 + filename[0] := 0 + username[0] := 0 + password[0] := 0 + + ios.start + ifnot (ios.admgetspec & LANMASK) + ios.print(@strNoNetwork) + ios.stop + ios.printnl + ios.parastart 'parameterübergabe starten + repeat while ios.paranext(@parastr) 'parameter einlesen + if byte[@parastr][0] == "/" 'option? + case byte[@parastr][1] + "?": ios.print(@help) + "h": if ios.paranext(@parastr) + setaddr(@parastr) + "d": ios.paranext(@remdir) + "f": ios.paranext(@filename) + "u": ios.paranext(@username) + "p": ios.paranext(@password) + "s": save2card := TRUE + other: ios.print(@help) + + ifnot byte[@filename][0] == 0 + ifnot ftpconnect + ifnot ftplogin + ifnot ftpcwd + if ftppasv + ftpretr + else + ios.print(@strNoFile) + + + ftpclose + ios.stop + +PRI ftpconnect + + ifnot (ip_addr) ' Adresse 0.0.0.0 + ios.print(@strNoHost) + if ios.rtcTest 'RTC chip available? + ip_addr := ios.getNVSRAM(NVRAM_IPBOOT) << 24 + ip_addr += ios.getNVSRAM(NVRAM_IPBOOT+1) << 16 + ip_addr += ios.getNVSRAM(NVRAM_IPBOOT+2) << 8 + ip_addr += ios.getNVSRAM(NVRAM_IPBOOT+3) + else + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + ifnot ios.sdopen("R",@strNVRAMFile) + ios.sdseek(NVRAM_IPBOOT) + ip_addr := ios.sdgetc << 24 + ip_addr += ios.sdgetc << 16 + ip_addr += ios.sdgetc << 8 + ip_addr += ios.sdgetc + ios.sdclose + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + if (ip_addr) + ios.print(@strUseBoot) + else + return(-1) +#ifdef __DEBUG + ios.print(@strStartLAN) +#endif + ios.lanstart + ios.print(@strConnect) + if (handleidx_control := ios.lan_connect(ip_addr, 21)) == $FF + ios.print(@strErrorNoSock) + return(-1) + ifnot (ios.lan_waitconntimeout(handleidx_control, 2000)) + ios.print(@strErrorConnect) + return(-1) +#ifdef __DEBUG + ios.print(@strConnected) +#endif + ifnot getResponse(string("220 ")) + ios.print(@strError220) + return(-1) + return(0) + +PRI ftpclose + + ifnot handleidx_control == $FF + ios.lan_close(handleidx_control) + handleidx_control := $FF + ifnot handleidx_data == $FF + ios.lan_close(handleidx_data) + handleidx_data := $FF + +PRI ftplogin | pwreq, respOK, hiveid + + pwreq := FALSE + respOK := FALSE + + sendStr(string("USER ")) + if strsize(@username) + sendStr(@username) + sendStr(string(13,10)) + else + sendStr(string("anonymous",13,10)) + + repeat until readLine == -1 +#ifdef __DEBUG + ios.print(string(" < ")) + ios.print(@strTemp) + ios.printnl +#endif + strTemp[4] := 0 + if strcomp(@strTemp, string("230 ")) + respOk := TRUE + quit + elseif strcomp(@strTemp, string("331 ")) + pwreq := TRUE + respOk := TRUE + quit + ifnot respOK + ios.print(@strErrorLogin) + return(-1) + + ifnot pwreq + return(0) + + sendStr(string("PASS ")) + if strsize(@password) + sendStr(@password) + sendStr(string(13,10)) + else + if ios.rtcTest 'RTC chip available? + hiveid := ios.getNVSRAM(NVRAM_HIVE) + hiveid += ios.getNVSRAM(NVRAM_HIVE+1) << 8 + hiveid += ios.getNVSRAM(NVRAM_HIVE+2) << 16 + hiveid += ios.getNVSRAM(NVRAM_HIVE+3) << 24 + else + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + ifnot ios.sdopen("R",@strNVRAMFile) + ios.sdseek(NVRAM_HIVE) + hiveid := ios.sdgetc + hiveid += ios.sdgetc << 8 + hiveid += ios.sdgetc << 16 + hiveid += ios.sdgetc << 24 + ios.sdclose + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + sendStr(string("anonymous@hive")) + sendStr(str.trimCharacters(num.ToStr(hiveid, num#DEC))) + sendStr(string(13,10)) + + ifnot getResponse(string("230 ")) + ios.print(@strErrorPass) + return(-1) + + return(0) + +PRI ftpcwd | i + + if byte[@remdir][0] == 0 + i := sendStr(string("CWD ")) || sendStr(@defdir) || sendStr(string(13,10)) + else + i := sendStr(string("CWD ")) || sendStr(@remdir) || sendStr(string(13,10)) + if i + ios.print(@strErrorCWD) + return(-1) + ifnot getResponse(string("250 ")) + ios.print(@strError250) + ios.printchar("(") + ios.print(@strTemp+4) + ios.print(string(")",13)) + return(-1) + return(0) + +PRI ftppasv : port | i, k, port256, port1 + + port := 0 + port256 := 0 + port1 := 0 + k := 0 + + if sendStr(string("PASV",13,10)) + return(0) + + repeat until readLine == -1 +#ifdef __DEBUG + ios.print(string(" < ")) + ios.print(@strTemp) + ios.printnl +#endif + strTemp[4] := 0 + if strcomp(@strTemp, string("227 ")) + repeat i from 5 to 126 + if (strTemp[i] == 0) OR (strTemp[i] == 13) OR (strTemp[i] == 10) + quit + if strTemp[i] == 44 'Komma + strTemp[i] := 0 + k++ + if k == 4 '4. Komma, Port Teil 1 folgt + port256 := i + 1 + if k == 5 '5. Komma, Port Teil 2 folgt + port1 := i + 1 + if strTemp[i] == 41 'Klammer zu + strTemp[i] := 0 + if (port256 & port1) + port := (num.FromStr(@strTemp+port256, num#DEC) * 256) + num.FromStr(@strTemp+port1, num#DEC) + quit + + if (port == 0) + ios.print(@strErrorPasvPort) + return(0) +#ifdef __DEBUG + ios.print(@strOpenPasv) + ios.print(num.ToStr(port, num#DEC)) + ios.printnl +#endif + if (handleidx_data := ios.lan_connect(ip_addr, port)) == $FF + ios.print(@strErrorSockPasv) + return(0) + ifnot (ios.lan_waitconntimeout(handleidx_data, 2000)) + ios.print(@strErrorPasvConn) + return(0) + +PRI ftpretr | len, respOK + + if sendStr(string("TYPE I",13,10)) + ios.print(@strErrorSendType) + return(-1) + ifnot getResponse(string("200 ")) + ios.print(@strErrorChType) + return(-1) + + if sendStr(string("SIZE ")) || sendStr(@filename) || sendStr(string(13,10)) + ios.print(@strErrorSendSize) + return(-1) + ifnot getResponse(string("213")) + ios.print(@strErrorSize) + ios.printchar("(") + ios.print(@strTemp+4) + ios.print(string(")",13)) + return(-1) + ifnot(len := num.FromStr(@strTemp+4, num#DEC)) + ios.print(@strErrorGetSize) + return(-1) + + ios.print(@strGetFile) + if sendStr(string("RETR ")) || sendStr(@filename) || sendStr(string(13,10)) + ios.print(@strErrorSendFN) + return -1 + respOK := FALSE + repeat until readLine == -1 +#ifdef __DEBUG + ios.print(string(" < ")) + ios.print(@strTemp) + ios.printnl +#endif + strTemp[4] := 0 + if strcomp(@strTemp, string("150 ")) + respOk := TRUE + quit + elseif strcomp(@strTemp, string("125 ")) + respOk := TRUE + quit + ifnot respOK + ios.print(@strErrorRetr) + ios.printchar("(") + ios.print(@strTemp+4) + ios.print(string(")",13)) + return(-1) + + if ios.lan_rxdata(handleidx_data, @filename, len) + ios.print(@strErrorRXData) + return(-1) + + ifnot getResponse(string("226 ")) + ios.print(@strErrorRetrOK) + return(-1) + + if save2card + ios.print(@strWrite2SD) + writeToSDCard + +PRI writeToSDCard | fnr, len, i + + fnr := ios.rd_open(@filename) + ifnot fnr == -1 + len := ios.rd_len(fnr) + ios.sddel(@filename) 'falls alte Datei auf SD-Card vorhanden, diese löschen + ifnot ios.sdnewfile(@filename) + ifnot ios.sdopen("W",@filename) + i := 0 + ios.sdxputblk(fnr,len) 'Daten als Block schreiben + ios.sdclose + ios.rd_del(@filename) + ios.rd_close(fnr) + +PRI setaddr (ipaddr) | pos, count 'IP-Adresse in Variable schreiben + + count := 3 + repeat while ipaddr + pos := str.findCharacter(ipaddr, ".") + if(pos) + byte[pos++] := 0 + ip_addr += num.FromStr(ipaddr, num#DEC) << (8*count--) + ipaddr := pos + if(count == -1) + quit + +PRI getResponse (strOk) : respOk | len + + respOk := FALSE + + repeat until readLine == -1 +#ifdef __DEBUG + ios.print(string(" < ")) + ios.print(@strTemp) + ios.printnl +#endif + strTemp[strsize(strOk)] := 0 + if strcomp(@strTemp, strOk) + respOk := TRUE + quit + + return respOk + +PRI readLine | i, ch + + repeat i from 0 to 126 + ch := ios.lan_rxtime(handleidx_control, 2000) + if ch == 13 + ch := ios.lan_rxtime(handleidx_control, 2000) + if ch == -1 or ch == 10 + quit + strTemp[i] := ch + + strTemp[i] := 0 + + return ch 'letztes Zeichen oder -1, wenn keins mehr empfangen + +PRI sendStr (strSend) : error + +#ifdef __DEBUG + ios.print(string(" > ")) + ios.print(strSend) + ios.printnl +#endif + error := ios.lan_txdata(handleidx_control, strSend, strsize(strSend)) + +DAT ' Locale + +#ifdef __LANG_EN + 'locale: english + + defdir byte "/hive/sdcard/system",0 + + strNoNetwork byte 13,"Administra doesn't provide network functions!",13,"Please load admnet.",13,0 + strNoFile byte "No file to download specified, exit...",13,0 + strNoHost byte "No host (ftp server) specified (parameter /h)",13,0 + strUseBoot byte "Using boot server (set with ipconfig).",13,0 + strStartLAN byte "Starting LAN...",13,0 + strConnect byte "Connecting to ftp server...",13,0 + strErrorNoSock byte "No free socket.",13,0 + strErrorConnect byte "Couldn't connect to ftp server.",13,0 + strConnected byte "Connected to ftp server, waiting for answer...",13,0 + strError220 byte "Ftp server doesn't acknowledge the connection (220).",13,0 + strErrorLogin byte "Ftp server doesn't acknowledge the login (230/331)",13,0 + strErrorPass byte "Ftp server doesn't acknowledge the password (230)",13,0 + strErrorCWD byte "Error sendig remote directory",13,0 + strError250 byte "Ftp server doesn't acknowledge the directory change (250).",13,0 + strErrorPasvPort byte "Couldn't get the passive port.",13,0 + strOpenPasv byte "Open Connection to passive port ",0 + strErrorSockPasv byte "No free socket fpr passive connection.",13,0 + strErrorPasvConn byte "Couldn't connect to passive port.",13,0 + strErrorSendType byte "Error sending file type",13,0 + strErrorChType byte "Ftp serve couldn't change file type (200).",13,0 + strErrorSendSize byte "Error sending SIZE command",13,0 + strErrorSize byte "Ftp server couldn't send file size (213).",13,"File not found? SIZE not supported?",13,0 + strErrorGetSize byte "Couldn't get file size.",13,0 + strGetFile byte "Retrieve file, please wait...",13,0 + strErrorSendFN byte "Error sending file name.",13,0 + strErrorRetr byte "Ftp server couldn't send file (150/125).",13,0 + strErrorRXData byte "Error retrieving file.",13,0 + strErrorRetrOK byte "Ftp server doesn't acknowledge sending of file (226).",13,0 + strWrite2SD byte "Saving to sd card...",13,0 + + help byte "/? : Help",13 + byte "/h : host ip address (ftp server)",13 + byte " (default: boot server from ipconfig)",13 + byte "/d : change to remote directory",13 + byte " (default: /hive/sdcard/system)",13 + byte "/f : download ",13 + byte "/u : Username at ftp server",13 + byte " (default: anonymous)",13 + byte "/p : password at ftp server",13 + byte " (default: anonymous@hive)",13 + byte "/s : save file to sd card",13 + byte 0 + +#else + 'default locale: german + + defdir byte "/hive/sdcard/system",0 + + strNoNetwork byte 13,"Administra stellt keine Netzwerk-Funktionen zur Verfügung!",13,"Bitte admnet laden.",13,0 + strNoFile byte "Keine Datei zum Downloaden angegeben, beende...",13,0 + strNoHost byte "FTP-Server nicht angegeben (Parameter /h)",13,0 + strUseBoot byte "Verwende Boot-Server (mit ipconfig gesetzt).",13,0 + strStartLAN byte "Starte LAN...",13,0 + strConnect byte "Verbinde mit FTP-Server...",13,0 + strErrorNoSock byte "Kein Socket frei...",13,0 + strErrorConnect byte "Verbindung mit FTP-Server konnte nicht aufgebaut werden.",13,0 + strConnected byte "Verbindung mit FTP-Server hergestellt, warte auf Antwort...",13,0 + strError220 byte "FTP-Server bestätigt den Verbindungsaufbau nicht (220).",13,0 + strErrorLogin byte "FTP-Server hat Login nicht bestätigt (230/331)",13,0 + strErrorPass byte "FTP-Server hat das Paßwort nicht bestätigt (230)",13,0 + strErrorCWD byte "Fehler beim Senden des Verzeichnisses",13,0 + strError250 byte "FTP-Server hat den Verzeichniswechsel nicht bestätigt (250).",13,0 + strErrorPasvPort byte "Konnte zu öffnenden Passiv-Port nicht ermitteln.",13,0 + strOpenPasv byte "Öffne Verbindung zu Passiv-Port ",0 + strErrorSockPasv byte "Kein Socket für Passiv-Verbindung frei...",13,0 + strErrorPasvConn byte "Passiv-Verbindung mit FTP-Server konnte nicht aufgebaut werden.",13,0 + strErrorSendType byte "Fehler beim Senden des Types",13,0 + strErrorChType byte "FTP-Server konnte Übertragungs-Typ nicht ändern (200).",13,0 + strErrorSendSize byte "Fehler beim Senden des SIZE-Kommandos",13,0 + strErrorSize byte "FTP-Server kann die Datei-Größe nicht übermitteln (213).",13,"Datei nicht vorhanden? SIZE nicht unterstützt?",13,0 + strErrorGetSize byte "Konnte Filegröße nicht ermitteln.",13,0 + strGetFile byte "Empfange Datei, bitte warten...",13,0 + strErrorSendFN byte "Fehler beim Senden des Filenamens.",13,0 + strErrorRetr byte "FTP-Server kann die Datei nicht senden (150/125).",13,0 + strErrorRXData byte "Fehler beim Empfang der Datei.",13,0 + strErrorRetrOK byte "FTP-Server hat den Empfang durch den Client nicht bestätigt (226).",13,0 + strWrite2SD byte "Speichere auf SD-Card...",13,0 + + help byte "/? : Hilfe",13 + byte "/h : FTP-Server-Adresse (Host)",13 + byte " (default: mit ipconfig gesetzter Boot-Server)",13 + byte "/d : in entferntes Verzeichnis wechseln",13 + byte " (default: /hive/sdcard/system)",13 + byte "/f : Download ",13 + byte "/u : Benutzername am FTP-Server",13 + byte " (default: anonymous)",13 + byte "/p : Paßwort am FTP-Server",13 + byte " (default: anonymous@hive)",13 + byte "/s : Datei auf SD-Card speichern",13 + byte 0 +#endif + +DAT 'lizenz + +{{ + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ TERMS OF USE: MIT License │ +├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │ +│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │ +│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│ +│is furnished to do so, subject to the following conditions: │ +│ │ +│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│ +│ │ +│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │ +│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │ +│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +}} diff --git a/system/regnatix/ipconfig.spin b/system/regnatix/ipconfig.spin new file mode 100644 index 0000000..73ddece --- /dev/null +++ b/system/regnatix/ipconfig.spin @@ -0,0 +1,295 @@ +{{ +┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Autor: Jörg Deckert │ +│ Copyright (c) 2013 Jörg Deckert │ +│ See end of file for terms of use. │ +│ Die Nutzungsbedingungen befinden sich am Ende der Datei │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +Informationen : hive-project.de +Kontakt : joergd@bitquell.de +System : TriOS +Name : flash +Chip : Regnatix +Typ : Programm +Version : +Subversion : +Funktion : IP-Konfiguration in NVRAM ablegen +Komponenten : - +COG's : - +Logbuch : + +11.06.2013-joergd - erste Version, basierend auf time.spin +05.01.2014-joergd - kleine Verbesserungen im Parameter-Handling + +Kommandoliste : + + +Notizen : + + +}} + +OBJ + ios: "reg-ios" + str: "glob-string" + num: "glob-numbers" + +CON + +_CLKMODE = XTAL1 + PLL16X +_XINFREQ = 5_000_000 + + LANMASK = %00000000_00000000_00000000_00100000 + +CON 'NVRAM Konstanten -------------------------------------------------------------------------- + +#4, NVRAM_IPADDR +#8, NVRAM_IPMASK +#12, NVRAM_IPGW +#16, NVRAM_IPDNS +#20, NVRAM_IPBOOT +#24, NVRAM_HIVE ' 4 Bytes + +DAT + + strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available + +VAR + +byte parastr[64] +byte rtcAvailable + +PUB main | i + + ios.start 'ios initialisieren + ios.printnl + + ifnot (ios.admgetspec & LANMASK) + ios.print(@strNoNetwork) + ios.stop + if ios.rtcTest 'RTC chip available? + rtcAvailable := TRUE + else 'use configfile + rtcAvailable := FALSE + ios.print(@strNoRTC) + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + if ios.sdopen("R",@strNVRAMFile) 'config file available + ios.sdnewfile(@strNVRAMFile) 'no, create it + if ios.sdopen("W",@strNVRAMFile) + ios.print(@strErrorOpen) + ios.stop + else + repeat i from 0 to 55 'set default value for pseudo NVRAM Bytes 0 - 55 + ios.sdputc(0) + ios.sdclose + else + ios.sdclose + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + + ios.parastart 'parameterübergabe starten + repeat while ios.paranext(@parastr) 'parameter einlesen + if byte[@parastr][0] == "/" 'option? + case byte[@parastr][1] + "?": ios.print(@help) + "l": cmd_listcfg + "a": if ios.paranext(@parastr) + cmd_setaddr(NVRAM_IPADDR, @parastr) + "m": if ios.paranext(@parastr) + cmd_setaddr(NVRAM_IPMASK, @parastr) + "g": if ios.paranext(@parastr) + cmd_setaddr(NVRAM_IPGW, @parastr) + "d": if ios.paranext(@parastr) + cmd_setaddr(NVRAM_IPDNS, @parastr) + "b": if ios.paranext(@parastr) + cmd_setaddr(NVRAM_IPBOOT, @parastr) + "i": if ios.paranext(@parastr) + cmd_sethive(num.FromStr(@parastr, num#DEC)) + other: ios.print(@help) + ios.stop + +PRI cmd_listcfg | hiveid 'nvram: IP-Konfiguration anzeigen + + ifnot rtcAvailable + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + if ios.sdopen("R",@strNVRAMFile) + ios.print(@strErrorOpen) + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + return + + ios.print(@strAddr) + listaddr(NVRAM_IPADDR) + ios.print(string("/")) + listaddr(NVRAM_IPMASK) + ios.printnl + + ios.print(@strGw) + listaddr(NVRAM_IPGW) + ios.printnl + + ios.print(@strDNS) + listaddr(NVRAM_IPDNS) + ios.printnl + + ios.print(@strBoot) + listaddr(NVRAM_IPBOOT) + ios.printnl + + ios.print(@strHive) + if rtcAvailable + hiveid := ios.getNVSRAM(NVRAM_HIVE) + hiveid += ios.getNVSRAM(NVRAM_HIVE+1) << 8 + hiveid += ios.getNVSRAM(NVRAM_HIVE+2) << 16 + hiveid += ios.getNVSRAM(NVRAM_HIVE+3) << 24 + else + ios.sdseek(NVRAM_HIVE) + hiveid := ios.sdgetc + hiveid += ios.sdgetc << 8 + hiveid += ios.sdgetc << 16 + hiveid += ios.sdgetc << 24 + ios.print(str.trimCharacters(num.ToStr(hiveid, num#DEC))) + ios.printnl + + ifnot rtcAvailable + ios.sdclose + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + +PRI listaddr (nvidx) | count 'IP-Adresse anzeigen + + ifnot rtcAvailable + ios.sdseek(nvidx) + + repeat count from 0 to 3 + if(count) + ios.print(string(".")) + if rtcAvailable + ios.print(str.trimCharacters(num.ToStr(ios.getNVSRAM(nvidx+count), num#DEC))) + else + ios.print(str.trimCharacters(num.ToStr(ios.sdgetc, num#DEC))) + +PRI cmd_setaddr (nvidx, ipaddr) | pos, count 'IP-Adresse setzen + + ifnot rtcAvailable + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + if ios.sdopen("W",@strNVRAMFile) + ios.print(@strErrorOpen) + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + return + else + ios.sdseek(nvidx) + + count := 0 + repeat while ipaddr + pos := str.findCharacter(ipaddr, ".") + if(pos) + byte[pos++] := 0 + if rtcAvailable + ios.setNVSRAM(nvidx+count++, num.FromStr(ipaddr, num#DEC)) + else + ios.sdputc(num.FromStr(ipaddr, num#DEC)) + ipaddr := pos + if(count == 4) + quit + + ifnot rtcAvailable + ios.sdclose + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + + ios.lanstop + ios.lanstart + +PRI cmd_sethive (hiveid) 'Hive-Id setzen + + if rtcAvailable + ios.setNVSRAM(NVRAM_HIVE, hiveid & $FF) + ios.setNVSRAM(NVRAM_HIVE+1, (hiveid >> 8) & $FF) + ios.setNVSRAM(NVRAM_HIVE+2, (hiveid >> 16) & $FF) + ios.setNVSRAM(NVRAM_HIVE+3, (hiveid >> 24) & $FF) + else + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + if ios.sdopen("W",@strNVRAMFile) + ios.print(@strErrorOpen) + else + ios.sdseek(NVRAM_HIVE) + ios.sdputc(hiveid & $FF) + ios.sdputc((hiveid >> 8) & $FF) + ios.sdputc((hiveid >> 16) & $FF) + ios.sdputc((hiveid >> 24) & $FF) + ios.sdclose + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + + ios.lanstop + ios.lanstart + +DAT 'sys: helptext + +#ifdef __LANG_EN + 'locale: english + + strNoNetwork byte "Administra doesn't provide network functions!",13,"Please load admnet.",13,0 + strNoRTC byte "RTC/NVRAM not found",13,"using configuration in /system/nvram.sav",13,0 + strAddr byte " Ip address: ",0 + strGw byte " Gateway: ",0 + strDNS byte " DNS server: ",0 + strBoot byte " Boot server: ",0 + strHive byte " Hive ID: ",0 + strErrorOpen byte "Can't open configuration file",13,0 + + help byte "/? : Help",13 + byte "/l : List configuration",13 + byte "/a : Set ip address",13 + byte "/m : Set network mask",13 + byte "/g : Set default gateway",13 + byte "/d : Set DNS server",13 + byte "/b : Set boot server",13 + byte "/i : Set Hive ID",13 + byte 0 + +#else + 'default locale: german + + strNoNetwork byte "Administra stellt keine Netzwerk-Funktionen zur Verfügung!",13,"Bitte admnet laden.",13,0 + strNoRTC byte "RTC/NVRAM nicht vorhanden",13,"nutze Konfiguration in /system/nvram.sav",13,0 + strAddr byte " IP-Adresse: ",0 + strGw byte " Gateway: ",0 + strDNS byte " DNS-Server: ",0 + strBoot byte " Boot-Server: ",0 + strHive byte " Hive-Id: ",0 + strErrorOpen byte "Kann Konfigurationsdatei nicht öffnen.",13,0 + + help byte "/? : Hilfe",13 + byte "/l : Konfiguration anzeigen",13 + byte "/a : IP-Adresse setzen",13 + byte "/m : Netzwerk-Maske setzen",13 + byte "/g : Gateway setzen",13 + byte "/d : DNS-Server setzen",13 + byte "/b : Boot-Server setzen",13 + byte "/i : Hive-Id setzen",13 + byte 0 + +#endif + +DAT 'lizenz + +{{ + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ TERMS OF USE: MIT License │ +├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │ +│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │ +│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│ +│is furnished to do so, subject to the following conditions: │ +│ │ +│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│ +│ │ +│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │ +│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │ +│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ +│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +}} diff --git a/system/regnatix/irc.spin b/system/regnatix/irc.spin new file mode 100644 index 0000000000000000000000000000000000000000..9e1732097088b704df2f97139d91bab7e169ae09 GIT binary patch literal 122998 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 Je-3f<{|BtdrL6z} literal 0 HcmV?d00001 diff --git a/system/regnatix/man.spin b/system/regnatix/man.spin index 753cd7eaa81f42c6d5c3897bee707f57fb1e9cd7..87670b794cca543f6e8f75ddbc264d427ebf887b 100644 GIT binary patch delta 189 zcmZ1x^CfP>G=9Z=hGGUihD3%GhFl;km7xSkRswM`Lmp5}gTY|(L=pSR7dUwgA>t)K zHMtDg3^@!>fGW~~JO!ZcQlNSTpz1szzlfm>Xo@0(=H_nxhb+>#jW&cCt&Q90a)wNx Rkttwf6@X;s=17tAk^n?pElmIb delta 29 lcmewow<2c4H2%$Y0@qk3H;AxIUMJ);S%Fbxvy51TBmlX*3U2@a diff --git a/system/regnatix/perplex.spin b/system/regnatix/perplex.spin new file mode 100644 index 0000000000000000000000000000000000000000..9abf40eff4221adb98be56663fb4854c0d1de26a GIT binary patch literal 28316 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 literal 0 HcmV?d00001 diff --git a/system/regnatix/perplex.txt b/system/regnatix/perplex.txt new file mode 100644 index 0000000..b0caff8 --- /dev/null +++ b/system/regnatix/perplex.txt @@ -0,0 +1,17 @@ + +openwr - slave schreibend ffnen +openrd - slave lesend ffnen +close - slave schlieen +put - zeichen zu plexus senden +get - zeichen von plexus empfangen +map - slavemap anzeigen +scan - anzeige aller slaveadressen +test - test fr interne sepia-karte +test# adda port - test fr spezifische sepia-karte +game - gamedevice abfragen (pollregister) +setgame adda port - adressen fr poller setzen adda/port +polloff - polling anhalten +pollon - polling starten +bye - programm beenden + +Parameter hexadezimal! diff --git a/system/regnatix/ramtest.spin b/system/regnatix/ramtest.spin index b55b2f20a9bc19f5d4e38653ff5d1b8e49186143..6a67332f50c084d63244d466dcdda159e1354cca 100644 GIT binary patch delta 48 zcmV-00MGxr$N}ib0kAL@lUOATvpg1t0h3S+6q6nnFq4oA5|b_(4zuDH+5?lC91yc& G9N0&!fe|MF delta 81 zcmaEHoN?C)#tjBylV6C-ZT1r@VVs;GrLb8|;uiDd4dOzRCvc0%W;2v9lrp3;|I4Z$?D$iNUx(5d5Bd!P@-C~v`ETLsln3)!H9^>=<{ zEpVVgm?(_EI8?%@%uY*FUlSQsRQE6wK$3AeOo;=;T-y`YC+xrMXAV z{j*DKp3a)W`KbHIz%Git*p%4zh)>;}R&Ikynoku`@t}UVbh{Ozl?@MfyHKHWGf3B| zO8)X<0q?r7kS|==$|VX~>CWL9MIPR5)Ob_D8V=-Q;2#Ef(LjUxI>Pk0rf|E8KKiQn z@|-Gc&Urc`jrUdbQX*a~VI9QnV=V(KYB&`^4I{i-hjv-3e7;{yHo>HXVL`K?DT$(2 O?lgA5Iu1E_QuGaZZhOuE delta 187 zcmeyhp7q6Q)(ut{Cr{y1nOyM2VDg0nT$^WHyu&{E)O~@;GTB_4i*7H_oE*2^fH{RB zb8_HRYgUAJnl-&*Nd_n5=h}XYxHGj_E-8is=nHj4YEC?g>pV&|wq-GGwL) murRVsuV4r25V)%_eE~b8z~l|L#I_$|XVfv-?q : FTP-Server-Adresse (Host) + (default: mit ipconfig gesetzter Boot-Server) +/d : in entferntes Verzeichnis wechseln + (default: /hive/sdcard/system) +/f : Download +/u : Benutzername am FTP-Server + (default: anonymous) +/p : Paßwort am FTP-Server + (default: anonymous@hive) +/s : Datei auf SD-Card speichern + + +Ein Beispiel: +Zum Download von + + ftp://1.2.3.4/verzeichnis/unterverzeichnis/datei.txt + +verwendet man folgende Befehlszeile: + + ftp /h 1.2.3.4 /d /verzeichnis/unterverzeichnis /f datei.txt + +Dabei erfolgt die Anmeldung wegen der fehlenden Parameter +/u und /p als "anonymous" mit dem Pawort "anonymous@hivexxx" +(xxx: mit ipconfig gesetzte Hive-Id). Die Datei wird in +der RAM-Disk gespeichert (s. Kommando "xdir") und knnte +mittels "xsave" auf SD-Card gespeichert werden. + +Mit Nutzung aller Default-Werte gengt die Eingabe des +folgenden Befehls: + + ftp /s /f ipconfig.bin + +Damit wird die Datei "ipconfig.bin" vom FTP-Server mit der +IP-Adresse des mittels "ipconfig" konfigurierten Boot- +Servers aus dem Verzeichnis "/hive/sdcard/system" geladen +und im aktuellen Verzeichnis auf der SD-Card +abgespeichert. Von dort knnte sie direkt gestartet werden. + diff --git a/system/sonstiges/sysconf.man b/system/sonstiges/sysconf.man index 484e2f7..57a412f 100644 --- a/system/sonstiges/sysconf.man +++ b/system/sonstiges/sysconf.man @@ -1,18 +1,18 @@ -/? : Hilfe -/l : Konfiguration anzeigen ------------ Administra-Funktionen -/ah 0|1 : hss ab-/anschalten -/aw 0|1 : wav ab-/anschalten -/as 0|1 : systemklnge ab-/anschalten -/al 0..100 : wav-lautstrke links -/ar 0..100 : wav-lautstrke rechts -/ah 0..15 : hss-lautstrke -/af : administra reset, flash booten -/at : transfergeschwindigkeit messen ------------ Bellatrix-Funktionen -/ci : farbtabelle anzeigen -/cs datei : farbtabelle speichern -/cl datei : farbtabelle laden ------------ Port-Funktionen -/po nr anz : Impulse an port ausgeben -/pi : Status der Port abfragen \ No newline at end of file +/? : Hilfe +/l : Konfiguration anzeigen +---------------- Administra-Funktionen +/ah 0|1 : hss ab-/anschalten +/aw 0|1 : wav ab-/anschalten +/as 0|1 : systemklnge ab-/anschalten +/al 0..100 : wav-lautstrke links +/ar 0..100 : wav-lautstrke rechts +/ah 0..15 : hss-lautstrke +/af : administra reset, flash booten +/at : transfergeschwindigkeit messen +---------------- Bellatrix-Funktionen +/ci : farbtabelle anzeigen +/cs datei : farbtabelle speichern +/cl datei : farbtabelle laden +---------------- Port-Funktionen +/po nr anz time : Impulse an port ausgeben +/pi : Status der Port abfragen \ No newline at end of file