From 5ec6f9ae782dcde4d9ea37e68ef5c9d9ef3d4c2c Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Thu, 14 Jan 2021 02:28:05 +0100 Subject: [PATCH] Moved tools out into seperate repositories --- .gitignore | 10 +- bin/create_disk | 1 - bin/upload | 1 - out.img | Bin 102400 -> 0 bytes scripts/__pycache__/mojo.cpython-38.pyc | Bin 5365 -> 0 bytes scripts/__pycache__/mojo.cpython-39.pyc | Bin 5347 -> 0 bytes scripts/arm.sh | 8 + scripts/create_disk.py | 122 ---------- build-mb.sh => scripts/microblaze.sh | 5 +- scripts/mojo.py | 282 ------------------------ scripts/upload.py | 178 --------------- setup.sh | 20 +- source.sh | 4 +- 13 files changed, 24 insertions(+), 607 deletions(-) delete mode 120000 bin/create_disk delete mode 120000 bin/upload delete mode 100644 out.img delete mode 100644 scripts/__pycache__/mojo.cpython-38.pyc delete mode 100644 scripts/__pycache__/mojo.cpython-39.pyc create mode 100755 scripts/arm.sh delete mode 100755 scripts/create_disk.py rename build-mb.sh => scripts/microblaze.sh (96%) delete mode 100755 scripts/mojo.py delete mode 100755 scripts/upload.py diff --git a/.gitignore b/.gitignore index aef0905..71952f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ arm-none-eabi/* microblazeel-xilinx-elf/* -env/* -sdcc-code/* -disk.img +arm-none-eabi-gcc.tar.bz2 +gcc-arm-none-eabi-9-2020-q2-update/* + +gcc-10.2.0.tar.xz +newlib-3.1.0.tar.gz +binutils-2.35.tar.xz +build-mb/* diff --git a/bin/create_disk b/bin/create_disk deleted file mode 120000 index 27d47ba..0000000 --- a/bin/create_disk +++ /dev/null @@ -1 +0,0 @@ -../scripts/create_disk.py \ No newline at end of file diff --git a/bin/upload b/bin/upload deleted file mode 120000 index 0b34209..0000000 --- a/bin/upload +++ /dev/null @@ -1 +0,0 @@ -../scripts/upload.py \ No newline at end of file diff --git a/out.img b/out.img deleted file mode 100644 index 472339bb30a1f0bcba7e6e62118e623a7561a1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 zcmeFa3tUrI);D~@oe%;6B7zDzi5C)Xnkv>5Vo?xnl_+AZtsRR(l~zFk3n)feXu+bW>(bpP|cGWz?-~))iH+u5PGUt1GLjud1k9wMHj>{@)NQs*j>p zs6*Ir$|*eF*TGq1h2QpBl`JkgT%5x8KDXV`Y4D)d&A!{Gjs@uowHj9;oHC#B=5y*e zmhEdZpZ015FZ*?$Iv!cIhFlVGA%%bIQzr%+I5>3@dtNFG^r^K-sz(vZWK^eJR_h2= zqURxe=t1u%<}ix040_2;toTmce6W87XW8X-@Xvct?66XMzwFbz>lME4BPCyW3(Why zBp>Kwp7&@X`{-6GqE(o6g8tl_M;WG(sve0HjnR~j>J#4W6BrNwrbqa}!`^!wS0UA- zR%#;pFgn5Lp(Fd|7@8dX=N`K-+0z)#?(#IEnf~EEP8|ahN2gjrZk##=qH9_ybt>-k zE-x_4quPX^e1m-umqj|`I8B|3h)CVTd~-a}5YGI=!vSE^qkVQ!$LsqY_)0(<*tmY{ zOhAs>pk%3zPEpqr-QOt|bc!oF#hgyj(kWioDdu;I)=o~UZck)w{SVY09M4%PTJQ?X z`aPaD^I5Oy;Xbcm>-Xv(?en@*9sDExf4#mWF;%qi+xo{qvPSm#{wC0^PmG8XCinB7 z^&3PJ^LBsUOmjKm*Boy%NA^wG z<#jfvVFgNmSg(6g@sKwGT@?HL}ZQ25S+ zQbPNi{=L!tma|?5^ZH34=Q!PQe8ng#CB<&IqjsS2MEbyO1MdyQpM3J<>nG`Rck8J> zxRU|J-;T3y_LWstRO+hg>T2sK#aU8NTC2OGdTkX2o)W|8e)@nHFc8IGbHZ?BvZ!=L z_b+Yg|2q@i-xL`c*$QQo@4fhz#4=GQIFO>w5X)S1qKS(LwI>*$npr0}SouBBwVi7- z3tqy!vjCH4PbUoS7rCGXqI;qI1iB{7o;nc`lQ$F4J$xdK>J|q2_Mbe?j~TF>@y5l) z_1|u@Duo+QB=^J(bZs8n-5=^__MZS^PJq*~uaLM23oh*86T*&Q688v26Wa7|1^2)S zpI;1Remr4~9x3A016CcHgf)pOmwG^qX8uCjvVS?@!z5(J3Uy43DF+@(g5*$zS@bDQ9~(OcJsc0Ob=M5cwj_Cx-d_do4GW=9v&dMp1yoW zaZ(X^l8mX_1EFCS_3JBENp=B|p)WrXd!UbLK8Y!;`N10z4+l0fgT(@V=1Fk{Q-9Jc zA%J1lpY)Z`XW?%6WhXyfkL-G41z^ChJ4w1!lU@V~px{^(_mbXGI0xpat7@vQZ>Xm* zKrtTnx59G33xmXnwI22nui*Dc1j2_G)RBMiS$^47%?}p4>^nG68 zdI|Bnyfmfoct;?BGgf%rm{%zps&C6PEibw@cv<&JcLB4(3z2{;(F zxr1WDsY^OkZ1M)jJqt5)ZEZy*HQTlz*gwX2L0!BDUW{OdA1e*Ac80baah*1uMg zlHmIM^CJDv`G3<&@@uT-)C;FxKeg-Bho`*y*@NEA<|6@`qV&asGxTwTQwj&$%zqD< z{~Dkh0-k2kc<@HLfPG_sp=`6bO1kc4)s~T$S z#xJf~i^O=zvdVI8<2?d*+A?c!U!i&5DaGffghQu0@TJv*_B_hb&PERlmre;ur@!;t zgl(sNoEY0FDm%sKPB99L9cNJwI+)_qLd0;tqEm<-7899Sr^%hj*2bCDgH{D+QG#gY zX{TT~-Qg5e!yQgb?4V#qph?PBN4Z_7I^n#|%PAr3Oy~<@8{v{af7~Vl3ZrMpTkZ6f^1!LW{xE z;e=K>$gV#lZe=D0%k1Hq?AvF=aAx`$wB=5>ff?&NEygo*&v@uq4E^~=H#>M*9L=ma z>MVzhf)?$gtRou}E-GoqHc>x}T>X*UaNNMPPL<3y&z?Qx>RN6#2a!@+dxX?F+P zbjCv<k$e9k%-f* zVo=ZyuyKoTpW)sE?x9sjjg+c#Oz+lktCKm@TUj4xU{aHXACD;Z{ zUj)2#M?f7%()$7}^bdi&%MShzgL#zovV#*w54V|i2O15HCI`84!lYsLi$TFO?C7MU zPq8-)nob7PA;QVCdQU)qDnNSzrG`16B~x>EfW!#R&osU08XokRIs%)YTe0b-rS43& zPs*nB#GP$^uIVM*ylw+KJm_|Id%UItfs~>JLfUW_7}Oi;y1)&$j^<}}rq2Rx4josWV{knm!`9aKdkVnrJG;o_vswBMK4He4TWxq?*qHmVtm23KJ;QAmW5-A0|Go z7g`%R=#FsN{Jde)%bc*)_g!LLW<9t0x!O%Ht>)C1O{Y-3KOj8kJLnXCJZt(A*;9d( z4i&%Gx2F^I2Zbyj2b*}wC;Z)qEx@OPY!68ae;TAe46waESQ%ty#}8w?UekvGbt`Kd zq));w_O$17^ySO?lTbh>>P`j>NTVxP$`C91EGGl~p%LK^g)_P#^FYAS?iAQT;jpiR zec9LCADO>mX)}q=(rry-m-Ntwwk9cCV)~Cjv^{bhbJGylEleBg7dt+T(=wGq5E3xK z7@TTNS8QjuWD*Y#IX$Hj6#L{*tP^5-nm^$GFoa34<>{8~hnEkz4IS)8l2?bqz70hS zz#JQ>n5GYz4~I-Vg#Hhr0O5~=z%Y+Q_JZhBUlziL1i!Bn{aHPGc-N4naBvTEVaQ-V zG9I@A%y=Mm*O2hIk45F-04BfF5A(?_X@1q_d-du5bnHJbn-2%*?*bd3H~n7%;EP_= z*lQBj{Ilmwe+eMy@bEXB>xLS-T+g0Ecb4x0uuK5F|{T!BePEDohx+5qIF&dGsuLB+kN@l@*q-WIFiOw2FL{P`4sRYG&()pzG zS7ig6E2Y<;haVe}_>Hr6zXxo+;G))b6Xs36E*kT=l*S~U}0ic^=Pz0s+AdXoK(ickt^ zdjiz&3b66#>Egj@9MAxN5B+Wcu@Ov18lM~KPA?gVTGQ4DMsxghEJ5mVpYV@!Y?H4I z9E2U`336zyP*KtL{QmSt{yu*RZ0%Lr6?lVx($Bu@SAtO|2?0FoXGpctNxb_e$K^!vqD<`QWAZE%j3 zVuU5gHJ%mjKg%QW=vkp_5Z-}xon^zZdJ_&5;UJAsDDeeZiLI{i!C)&j#nfDYzczmx zP*9YEzwUx9296sG#GZ3oK4#`#u!cY)cxj>p=tFY$mTv=mzQ1JW4!tK>_o{g$`%4boanLEp0R;4LyDV-ph0xD;hXDA!`SG8rB6hg%zRX^-m4V zix=Fe65!@g=|pYEm7%*XG)`4x6^Cj2iJfe1^dXR;ek99*0(Zf67O+62b_XL~C;&Wp z6mVz*22RNCrD^!*{;hs{vcaAV&t?zq-AjCinyl=c2c|Pj2=n>-ec$9aNeVK0?<)wCN#BLc6f4NWf_Hox2xaj`ygedY!-q5FPxOY5tS z&=4p#7}g`)FtuG-06~#xi((J8fyMqz>Ymc|KA&h;)`&|p!lSbv+6N?ve9@i08VY@S%cWL>OUmf z1uLP>CoH)HJI<>qY@28D%tb8rNbHqrr5VEx_~4H*AwfunGC)>)goPhhLU)}+_eB7EAr9jdFEiH#AU_)P zr<)50Il}sxAIbG4>FW9sL)((Oq9qs1cP`!X+6wUUVsu+xt8Lk_8YAT_e?>I(Gyy4( zvix02H(LG{09wGt6gLm_#mCAQ%byY&+Lz$NyTOYHnhY}2JHoquuZiDAc2*ZuT! z{-xose!As9<-h%@`9I~4|Fr!lMPzJZN_dPWIW#&>8xo~XN{vt@j1E)AkD?TjTO%(k zwn~G9v-xEfTP<@ag-5WgI6MWL zVU!rwqrYUOY%JAxG`(NJPrhWmj3=6$l)2{8(X{@p+|f`}%)HcmD1>X~+VHieq7=fd zzr?|=n-9f`VF$@$8GJO?45x6-hgA5+aNcN+M8nm$>p#21nLfK@)g6jE8rL7iKYrruu$9g$x0UJeE5H~+Jbv})KYtdN7nYNs z@eS4+|K&$Y7tAVLJa4vCkG9rOD(s)ylg9X91ZPP@L|WA4ux=1GVYlD&CWw11~%^4(R5U$A3K`XXozY0kV!ulq?mHd zj(Soucka8xxBhz1btg z9Ya~k*E56vMo}v~wC7lg-Q8$t>W}+5W2G87R7Aw7sXhE>$HIrdIHoeN?;dOBtd}{v zM|l01TfEHo9{YMy@ZVCyFAD!;m_C!6&P|?TzGmvQyy@4@D4aFBsCW(? z=IL2IxAyY4_L?G);gm-v58u-(Du?drHHEowD3dE$N-kA*rC0 zR3&vHG=38JS}Aj=+Z^I%5B7qq-9Wm6s9Pmj;*MED-T6G#2O3L=Ta4om_U41wssq&Q z%e`nE;uc!_(6Z&1t&rdH%lyyuC~ZUoj&$RZMtxhKaCe^=%h&ap(eIUHv?K)pTSJ&P z60t0(4n1axmadX8xApxj%&5LA!my+I&;y-7(Bnv7lCj*~cQlQ&#)5-Yi3@i$uD_Le ztPi*A`QP?g6^E3~hhmxzsWu;qwf_B(+NwJghq@^KeL~X8?8fbARHK2EF?+z16!O95 zUH_)}?vCoURl0^+-P+oUN?k@} z)vD@s6>E(a9Tg<3sm&o&E1Mgt>Iqrp#&zre4cYuzg;z_nbdw2X-n41gOe2h<#@u@2 z2)C)(mDQ`O8+2=`nsgPFm33A1^}39W^;No!>(^J+Wv{A0vQXEsrmlA5>NUDKq;;&a zxUR0Y&Z4WXxw~R*b*0pH)tZXBid7g$mad_$Sy!>TqPpg)$b`8hZX*`qsRp*SKQuIyt?Lg})`luqb9Dc47!2J?j8gDREVlK+ zVbQTC{<&P)N6Pd6Q~3aWfV3xF5_WcULmhWYhTnm5(v_#5G~4i>nn6+z9WC{#>n&P9 zKTB%eLOOAk^r!zyYW|t@1gXV@aSKx<>bL>qe<{C*UUro_jdBZ*Nn%g`Uy<>IjHM|0 zYY7kl3NLg^f2^|1wm^4xRb7tmT4-mcj+$M&Ze2x9WxcL?-TJjv>#AVWl@?SLRoAay zThUyvtI(OJQ=6;U3C|+;dNE(YU`RM)k|~Ws-5WS8!GA=s%uv3DjG(pFdbG^ zG*s8t5b~wfYuD=TB!&;O&ZugtTD7sE%BWjkSG&5dVjXF8#g>U6bwTr*kNHI8SXo_D z0TY#`S#=E<{455>RaH^hOt{unt*WZNyDBRv3XHm zcSTCHtgou8u2`#EUt8A@G~KH_>#J%igHxcQrdfAamDG_m)EtTs)$3|&s?dH_Lv3A< zYh`u)T|}CnMO<1}O(y<769x$gDQQCbC4PY-K7=AbQFR+@sF~E7s7*nZLN)QdE4C<)*^ab{Wk}m}$m@{TA+Ix;bcHMNI%icSl2qZU2D})mTY~pIb(Sl+Ie2Ni-a=t~I!aem zM+jzLc_q5KzM*&ci#=Q_R=uW|8+`%c@q@)>Z0eSFEpCRo&1`-B`W0R(e4; z*#75=Ys|V}i=t}0mWr1{n{{{>yso;co|?U;YSmqk3lRQuRgissuCBPL0k6U04O7w` z^0UbMx71>Z6SC!aar-XRVmx<)la#Hebk+4bs=NxX*b+2~@P4R8S7|9AP%W-%(9Nr< ztj7Dexu1taLD%KAwYml54P8m8MCB4qX>EgUPVL5;N=mo5 zdQ%nj3`8-WU{3^PUE!)#K{Zo&i?@NijVsyGm98Whej)VIx>`s!dtvSZ-Az?>^?12i zmr+)=VIx#ouQTUNHc~k0VTRtUrOUMe;dGd&bJ@ZanlQl?#y%EC-=@t|Se8>qs3VG3 z{Fd9OBRV8H=Ke9=RTm~)6AKd5;^>RkFd-xfIpHB?Zn_Ki&tpwyZGfZo+6^YXb|U3f zhY0hNICZSBEljP%g;VRul^(BMpSi(g(AvSJD-4NJ6ys*l8?>wg1QQ8?@M@T8g0^UZ z@L?FIp(u5XU`vt`Dw3cx&`XBYi<##zLFSwrD~j1vYb+|a0`DzS1Sk!eY-Y~vWDWerzbDMbUW$V^c!u8M@lM|X`{PR z_wcz9R*D17R3|r?N95=nAm1RA|L8SAWFMB<7V`n^p0d zYg2@2CFJu)uv;TAST7jSE49zRlIyo0$&w7^L!>NMQ>Lq_oU1A8)l~k~R6#J6?)ux$ zo#rXn-k@0J(v7260iFsXHAZAvrEP?;Q#pFIwl1?ilfbYBwriy{cW8x^NxS*FNK>WO zYeH^o5?!sWCpqDsBz>iJ;WAoDq13CtLu;jkLrJ^$U48|v-!S;?&q$KM+$$o5U14l( zB;iU~sg4g~D)!NgQGH(sMLNLwzI zhe_r3eCR7Uaf6k$q!K~}b6cfc8qql6_@vY__DV0L=ntd_K8~YbA~TqHyWgX+CVmnW zB_ROo6SPfwlFv{UjMuM)rU+Q=*;exq6< zrs$p8sW6a2rR8;)aEv4lh?GXyI zix5n;pfH>n9b*Zl%x`Pyx6mY065ve;pp8Lw(7jd?0_27}~Ot zO3Pc?eeveEw4_>0PX|MQNWTez7$rMLMf!?h-j7lIDFim4=#;L*(p4KuN{r+R`l|x$ ziUEUvmEqb@$RNpTRpGX$XJ-uiKn&?U486PVieY!gNGqGv^r46TSx&YwMv`iF%!pKx z%zwlPDN%62BLz{65F`8$9n2K~IWp0}8*o~dX~hD5Fh+45krqu*W_n9f4uK&p3{V$< zRJ_b2sTA`@i0HSqc|SoM!VB~FS`{#gj08fETH?&6kRm#idIQpaVh$ymBVFm3auqru z$t=D~rC2_~kbPXq(eFyD*ej`-vEe<l{Ka(sK>JB1{4tEDWA2CPu7Ha0Q&`%r zc;Z)8>bu}6$RrXLh3j=%;fe=Q+(~rCsTIL_{*;PStRo{4!efOovC^#iNGq%j*YDQS zj-ZUllQrY@Skp&jZao-las=mAc&y?c!p*dslsCnyrBz@{ta>T&QumW8@WlKBhmrY* z%|u?(T@ct7}#xB3%4cG`;1sTV{qHk^Q79e&q!j3&yDZ}!Q`KfDILl^ ze6yMm#<2IRE&Gf|V&HboUmKCkH}5kt3)H4PMgw|bbJgf5-Ssvp$Rq`~$C*CWB4L2= z=uJa~&`4ZNdPNgYnZVmiM^MCjzmh8{`?Ol|I?-5AXv9guX5gmyTx*Q>AR(=|L>OvB z>YTX$iPVi(#?^(QLlRr@Iogo+^j83UWWBdu7W_#rR~#t|A!CZi z0!=hg5YPJJEMFOsd9cy-Z5&$=|MMX2=1wE(#1Lj|uvDR-q9vtSI*p%@%1)RPZ;6*g z#n=dJiqA1%ZwCSgwl|Kf*Ge^}D0BhyXKs#Hd`@6zmnRZ4yv#h4fB+Abkgifg)X;9U zQgpjZX`O|YlM0;Grja)Bb3-vp)u_>D*g;jkp&cLhsvR4m?9}B8vMDO4EKuR zm1}-EI?nhD>#m z0Lc$Yt|t=E#XpS?#5wUEj2^4|a>}ht2u;jpKG4w1DTI}T@qmWR-`Bz|Tgkras7BFG zShM{a(-!JVM1Wx6ioIcQ!6@NM85Dc9Ea(wOh=W$EIT4DG0>tVv5?tjHw-rt1T(mth z-8C;E=+H_NB!>pFt6nr1hbc!$VNSpxL7hQdZhIn3E8TTpg4&4e2(0XV8aODJ4lxM8 za21v1i9%mky6b}kAt8zbanK%s3;3A!8xarE$%)aDNeqmLW^Mh1NZ81xCtfMp`o`6g zpiIA{87cXh=9>g}!nuU-#D9f8Gf{$G*ch%jMSzB(2cwP`q`(56K4>NE3ke)BCm+o> zFor)HIm%SS_qoIfZ47{G6|C3g+sJ%eZzdfDC+nh6D@*KjAqUzs&fd~2aF4F zLs`CAFfz_W5)xdA6qwv3Bo+QpK@3lKO-#c2BCHB$vyv16$#mzEk}Dya7{wGPA$DX@ z`gtse1KHSc@}Ce+aU55DJB%vzp4!CJhgWmn6{9F`>I29;ekJodGCNmuI8lzGtnq%M z_jg9`6HnK+Y+s$|+MX0W##g{Rm~^Gu=rwv>?yD@&)GTe*xaGHpXf8^JvwLGoUg}i zGM+c;OzTYlUZtBBZCTX1h@zfca{Wy=-&C=va?$EV*M-avSrGD2$Oj?aA>NRGgoK2q zg{Fs&54|~bL+JgXFNVG!+7@~`R3A1YY*yI(u*$GCVbx(v%D>rFy7$Lfha$=ks28(Z zikfd*>||}FhhLmuTDJV<#6M zNGP6DzEfe_H-#!LD{(q)dw;rd-cIw4i+5ggW6{p3^NMzcqR+$kEt$Xn`N9RxuZq8Y z)^@m?T3CGGKb9Q+!-3~q7iX96Oj%ey&vxK*igfz)lEaMcM&}E*Lz?2^uVF*QR9xYy6ZYy&>UMxISym-k1=i88mpI0)sd}m1M-l*czCBnPKDB53GT4Y-= z?-u75RJrZowxxv!UoX7L`SrrtZyhc#KG;=qAZ(E<6z=XVPWXBY1r zy=-xLvG64|xA?#}WwryamD%R(+gUj4t%KhjC_E5LEuL5U)n697TvXxyq{6a=<*x6k zc}3-&e=MAL_;+*X&3ArWT)KC6*}QV61L_FC5_b)~ckZ3@ZT`Pr`2HVn9^Ete<=H>` zsOILDmaPltiWKPIjlzIP{ zYm8KB@y+GB#_EPOwHtBzfvt>M++5R8(WI-YtE;V}$_PfKSL;il?OBu!l=yM?qQde* zYTnwlRjYBZ#~mAMaB2q5H&|7%b}ePYFUQ}pwzlyKY4FF(sUF$yc2b(^Z{ zYOnTRDV>f%l{c@i(ygnmUsutvYR#42>v56>j$x=L=R#16gP8^#0kIZ`GhE5vQCqie z|DHOqy1=TqB0s_^pufk9(srdwql^gHCug~jhuOK%QKjsc~=$4MChUf`J zGpVI8h@bmdT3lL0k;~OyrFv=(=4{c=+~(EbSdAL!DJTIsZG)WYaYY5v@fS5X{^Abl z_=~I6>uM{jf@fn?tgXZE*EbWH$KAchI&a>iR_Mzu!wmz z>!IBB74;3eDh!$Qfa6Ta=_n&saJ5fz&WO|l>Kk9h$n>h%l%li(McNESTAm_pnj&qgBJCPQnpKfDU6FRZ zB5kH3&8$e9tw^)5y(-gdO8xf8v=BvFj3P~;NK-1(5)^4kinItt+9*X@EV%1GQnr~- z$C%H>kbVLx{cfcqB-ZqylHD=8WAlyXMU1|DE*|OV9 zf1%{3#=gN!jh*IY+Y{Ovmzkf56q07qABAlei(Ct1MYF3cR!r|%5^K#klDI-RlVljj zEQ$4iU9Vl7$<)TWLCY?T6$~YAjd&Rl?5Ah(Uo1msdlRNuJA|UbHo|kkV#2mqB~X;* z(a0kq`@8e$%a<`c%R5R3ABZ*WQhJ2cDP7&dMYYw`!^B#3!jbERj2pXLJ+W=(ca-cy z!P{W0={;pi&!O0EO@MUQwCULqD}*QJ7ofl|WF!giYH*g% z{yiDp!sxgzpT14$dUSEOQ>eNPR1Uuvpn1`4&vj~_pWmP4aQZ#MwDE3Vhx7X#`YvBL z|B$-NaxTWfELWTER_cGRG%?EF4o|d4_+*w_&nUeO9bF!Sft)a+F+|1SliFxVjA{OW z*`n?e+SGI_UTN0vj5IwPssFQ5m_FOIBa&qQtkgdn$?k|Xy%_0Td6(VrNvFYJusisJ zYMedgP>V4=4z&=G2qD?e)CMp3vu$b|!_>`t!FOCzH-BC&9GZPjGkkgPxFm*CdAoW& zU{9{)wm8cgrNhqO8)xtf%QU_t7QP}*yn$IAXH|d+SRGlyOo;Q_9lb4X z-W0b7E&O%^NZEC9;!Nw)-A;aPyyng@;g+#NSaHwq;ys%Eal)QB=13fdr8!8_)<^hH z<1~jximgv{uyf;69i29``K;ZL$nJ?NvEg(y8-;M!jY1C{8FHkMoVY_?jdmMw%+Od{ zYX4TgQe*gx$&XJ>bPRdpn#ByBj!zX2;VQat0hO4;kBt|O(N+p??fX(4!zJ+@T^CyY zIA&m(h5+Lul23?p6BY&WiR{U^Ouy!qcw4H2uZ~arj9C!R-WC7&u6N&g^X(%$9)0GO zN4|N2YGZ%}ns#)FJN)~XYJBh!_s4^gbx1tQOw;&0fvar?%g6&2cq zY)@(u_oOltH0-MyaUx@j^FT9h;nuO@Tx$$-qsFR2E6kSau^p^4-fBr8mffC~3& zNi{A?TnwDG()_wocx(pj`)s#Y|EAK55&MOZRG&w9H=S;e5!y4{T^%0bRFeLWN;-s^ zA(X2aO+s{c=1rNuF&I3iKPqAR?k>is=?dsSRI0nY>L}r>S)>B9WP4;USRVj5yj$gR ztAebDN)v=l#$KFrU>CdgFV=N?yuxoY*bNE7d86=ghTGY#pzc|83o5M&rY=DUP4xt8 zgkn-@1G^GuCh)^#6poEY!h_QnV&LXXZz_8u?sZ<{_p`4SlY|GJ(Cyf}d=}i17w?MC zfQ(*pgp4P_f!3J2pYRW;4AOZJ@RDMTgYQe|w%$s-V(Jv@ZMb)N$sBq$p}X_QJw2nf z;(XV!^hit#FCD3f#?s{U8o=-%unkXiJ(%d|gh#n2QA}eDiI%lW2Pek!w`FA%D4Dks;p@oY z*w8G?I;9!r9L2MwN*|^&tyk(JR5%Mv$)3qb3ssOMFiepaC4?3$IF<9eBZamS3|&0O z_=$H!F^Wh@)6?JO_tLx)uAv@wP9?eRVpcmU*uxUxO}evb;V@jxLazy4AHWc8iE93u zBr(>D-bqm#5Xpp}Ma@BvpWdDVL+YtaT6tHBF~#URG8u2#r+D4$>?EI?jt!D zUMv%?o2_^?fqgbf9STds6z+ifVQJPU{MR_y?MY4)5hP;0ouZofYY$NDC5tK{Bj)=3 zCH3KpYS;dx7;CKgZKYet8h?8=mlg$?+ecj%7OIFTi%+D5B9w5$tms!0daZ7SMNLIe z&2vl0U>u#Fb{gQohm!L73rR;FXZ%T@KDw0kC;9e;vf0{^IVDZ0?kjVuw*;wAoA?4P zCKr;LFqIhIGgqsjR30&u*{X$`@ep-kb%B_!daY?6nOEP>&uPK5ebYzG_N09FN77Nd zDH!Vj8gDyRH`OSZnZdxGN&@S42R}LqNaEDDZoXg?R#0y*Zyn`DUs+y66<$)9AuXgW zyFsddPl>?8jp(8St2BHMjA=it1CmL?rviQ8)oIb`jAPiIoPD#lP@BTE&BWRkC;(7Z1*unvg7B z#~(}XK&Kw!qrM*{7^etd&B@b26H|rqIZRqIQkEwo9ejAQ<*CS$d_FDN@;I_-$q&wS zjY%%}lpT|7*)~#9g&^x{#bJ7uFtNl9K@=Gjf|6+Pvop(+C2sSQEl;8mSn_2Erm!rOdsr=iB6bAR*ARHWv&Z zOU^Hm0>g0TXtEofvu}-R1E!wUwFsr$92h?!8u&LC33KNQwWEoxUuWv}2$OH@>gX9& z&SzRx&}o0B>3V~qMn&Ln(Z0wcC)3UEpI3t46Ev( z>Cp&r5lnMJ%pwn65zStgf}WO*Mo)?tMmt5ll|r0ry=*=n(=K$*fvGT0jc!AZNcqfY zNOqlvpw4+L$KlI&jkeB&3lB!QlW&xyYcs#0%mX~0?(R%$D_Q@5?jsg^rg$rVWVD#U z{A08s0>>zZCrVQCQ&GnMWi)DgMvJ%cfzhIo=@}i4FCmFafe4%mVR{xbYcxzxiBKTL zqEr9YW4Z#N-bl_G(1 zC-4@YYlVxgXn_iWrM*2%RLmFZ9L|r=mC2Y5Ieb4No0K9U1J|mnw$3a8V?` z^ZC*qP6a_AIlC>D#1JoJDE8-#+R8qZ+KmvT%cIyh4(TSb@}RR@6IMyj8b@@-+?+~W zv10igRCY8Y1}Bc2`6*Ql;YW`V!}!%>T$y8*HeoT%7_$ji+n6SlRw7L#cGZrd-wwm- z7!4V_z{$x8I+Jid!>td&dP1oX%e|d}BKo;7ME;Qv)IR>)YO;A4X!3)~N0#X@K5vX0 zi!^)P7|7kxMZXfp7LIXa00NHbL6C%{TdJ=fgXk&AG*ZK^oue2%4F9$3}!3>?pu6y{_MlMKpY1?2*Ym2gb55j}=QuW;!`NX?LwR zoUxB(kE)2Zdr>Z4>*7?3qbjHIJMyn1f;uwU7VTx<8w=sRoWXwN9x;+RF_uK=VuqX9 zKiwJ`K}Fh}$Ty4OuDEf*5oE#Zd7<52C}5+`+shiq2~)@RZV^>Ix^dzd&-dqzZq3}W z-Ea!gD#a@#SiGZpKr5c>6tg>%#LP}{s56txf2!kE95N_u&0s6Wjk*Ppz%aMu*0$uX z1{xi#R+>0bt_|akggT~kxNxwNO-5fACQ59UxS4+|Q}OLMr#OdsZrtYGwJm?*#D&bO z<2Juu+p>cb^O;@aHosTf@(w4OnNN`f=XY|sExE6eE_NXGOl`}Ht4Vx_)!^_rtOohD zZL8Vujl%G_ZZaOkBlOZq9w~|uL*dSRUd&DoVBn#%IL4KjCTe;T(~!5+C>_Z*FWnFs z?d7EAa1%n8z88CH$tY6Ogv05=zI3w5MiidGAYgz|JvPHG8hNDQ|JWizgX!k*!;^T) ztbkp0BbLly($YbV>FkBk5KCi8$>?DSn4qNCHms!83EzP z3{sDVq^qyfNLL;>4XMj}(tPI97@vcWOUKkBy9D7(1|3Ds2z2FyW{trP_E_4OF=N2s zff7q;jIC9ybd65(Z^6l73uB^fLVLR6t2C#RwP=Z8WZFoKjn;0+Vd+=y3-ia>Ac@bG zi-TJsjYrd`L@T$xPiZQR(f2EHj@1dJW+Ap)=~!b+V@#jN81$dVwCpxJVhFPzQzTc7 z?GBvN!|9ssO4uFZ!JdcHNhGK!G4(0SZ^N0+I3^GuT4L`FfKBEVHg2D%KazedjBMzI zEKG9g=}FUv%oph#iHi*_yWQ<+Dgc?ch^%99oDkGZr1u^G2QdsmK+=T%GyJNRH&T z1#?eFa)@>2>h_Jz&A*QrmK2X|!l`+i91>ls&a9AFvl}HwSb3J|n9)h3)6JX|?{x^@ zsmZgZ;NvcL7g-{jKI9*Y#mc#V(JZoB7@WQ2;bBM5gR#9HCwU%)EgrTm(Y&AwMhN{n zdS$fmy$)dz`?SuE$ny1B2KIZMVrBHG%WdZV7<9k}bfE@qr`-`kHhNLCs9Vu9mUavm z(ksY=4;l|XTx01rHkY>aBLc~$^O%Eq-a3(tdo#IU`zeN{Q9ak`(`X(SY?{f#Lc77iuhU;8=qc34C_|aw z=z--Ly;wvp#Y~|-jbaP+n;rb!5-HggLo%ZAY2!P(oK8GfbUmvtzpd8;1!HcKN1%q1 z4*DT=uNRLIQ$s=%QNg^Szr7ky5;@_hURZvcotSW!z8lFAv+YXYB-1;p_qsX7CZiM6 z?V=@8C2niSqlb%Fh!w3*V}O9bu0Q=W_J+pD`Ek+)}bQdfu1)6L#$h(_A$p{2*IZlt^6c=5=)i?1P} zSf-b`(cl!GHgt5kgEjo)25=a1o+^io?yBObM%U5{%>r&xa4qUvn^F_{W$D$4=5`snBye}r-{8bEu=g8!|Z@htR9`9$D z7xK@JAMqLN2je~Tr{f{15PM@6b|c*g61sA*NqufSR!#k#*9zZEcXMUSww!N0`f zhYj!t`i$&r%+vF(CBJY$64Q;8dK}v~UY&|ZJ@AkEy)oV}$;(j_#2vhLg7^({cD#ep zP9R7xyBa8i4DvOLsdheRg7`6iX1utY85|#uFDKqhviFfJ*|hT11j2db*%gfAu^Ant z2MslWUo`=UWMyiuozRP2w!542TcTCiT=@JX$o6q`Y@XoAfFa^4G-Nb6I$@^{{_Tuy zt{oF{^SuZZy$CY#xHRRUUpSJn+9#}>*y6y-J;Y5AW=(V%CK{&l4^Pff2#-u;4HMh8 zmDqp3!eD=Kslon&?fcS+YgVme#2d=1YMYKkiGOE)n9yd9RBRX8zrZ~{L#p$TcnPtzvOftPE2+s3|~ zF}6LaUDd8`o!ZVmG}(S1dVLhVK4RnOD3v|8v8{Gn$(G-**z)4iEic$OL}yVw8z#=a zWs#ay-JHInDZPY!U?TqFbWhle zKc?I_e%0*zHVRMN|Mu4V?hPZQ$39qapR!JK-}$g%&Q?@cE{@I^50q1?fZIOiH%AHYvTo-QV=_Zl0fH z)ww@r$4^Y&oVH_C zSeyKc6sk(kmxqco5EZrT?rdRg8NtBZ6hWeM4s(QTE#UkkR9+4mfmUpW4dINC!I2&!r>8g0Og9)Bn~}1mzmFNG(sX99!x<#OWnjBVqOtGr@Qwon z#Tj&Ih6kfZJko$Nxw z4v+CPNh&;byUJxus%?Z%q9GzG^?7ETaZF}7bBD2m6XqG2(hLrLW3(56$FUcT*frA8 zd5BttiCKbZWM480%@csA!{5Kv9HEkyFxOF)Fv~=+X1+A~yexyuP^S_54D2=#@6$(B zo*<#e2tscc5W{on)k;p$x{YkVB8=@7cd|!~==tx%8WVbkK7~9JR0>_wp{hCXBP1@( zGqo&9qawDk%Q8TF5QINzObDy7^Th_(8l|v?v2MbqlXa^~V6=`-4`FpAq%qJ!XO|>$d37bAvXKKcC`%mF1gJNXn zed^EL@YApf7}}su>!;g<3E94%e#mMwUykt|WS`E$V+i{+hk^fxiSuA=h&A<@)_7yj zk?Y85vuT;pNEI;gnV8Eh$*+_MXEK|&vr{uk+OsM7m6V6$-W@t>bdtThFX&;Sve?qe z*zA07^mGfyGMyub+ZuZw$s{Z{faN2Z1uWUTQ!*snAFo@f`J>6>nK2dDm)|PZSIkg==;aC>wEHkf_(@a)j!m=UR)+dP{pj7Heb98oF>XQkH z=qW0j!vcmLBBI)C%`Z2i>DX*;g9l4kezx1Ap`uFbmt|_1DcS6#?0wNo+uYhtPg;~c zy)knfGbfv!nGItbrC?`gtE246jo^4|HgTbymLx3hgA;_nB;gM^8xkWT@wd}%{soXZ z(@VY|&H@fi9kI;4*eCBTn{!bXX`^gk9bnVO5?8pv!9=0-@ zKsIzFTk;ij1KgN82O|qsBMql=HEWIY3!`!bJt-uLxh4m;axR-tsdIqkw02+&eOtq( zbrvvVa=0#Q7#K<0uL33`r&}sWQgx76uz;C?0%>f|N~-`F;)O|5CC&aJhn}w5Pzc@n zvQl4|+0&3?eGdDB&88>g@29X4W~C$qZV;o{oT$pw--kbeJuE*r=}Q=e2rZ!&uP>{YHvd9Zui zf8OZZt21F6!FBr4(BGGn;XCywsFCaT1PgvM2?g0ccUL~w-SkL_(}NJ4)C{Fe#=O@E zUUhnREaxMPizEr}|& zX>#-X$!_-L$vz(}A($Xl8#$NRsK5;rjp4)wRGkRp0xhO&XfCmCzPxK_NXB zN+ZywX$om_n)H>Hwn?3C)eSAz2gvRw%A9=wp@7d#2h^dUOw>E~@#<#gvqcb_bDG}f z$Qh*frgDSc?JP@0i##nYu}`Yd!7`@`89Zjp z)h0n&&{jhV!kIk&M4lW8O5xer9kcXb!sH^`Q&N|CLReY?;%n7!@vYUgpP3_At8L~a z6qn?=)@s{|kmC9bzQNe4?7z_WT#0THd*33QwBY+!N2{Snif`AN=I6B*EWz#GnI*!G z>i#1ImE4Z%tuq>I-S?oeg~Qe97TPq^rV3?Xl47%xd%oIitJ(_H@?{)cgGa{9cZV&% z(1WCH2`QJ!N<Riv)rgaiaHp%;=24GS zpyH;h0mDdQHHSi#m4|3_I0Q}2kAdN}q*n;#7Wh;9A9`r$p`D)e+$pbxp3bwZ5B6h_ zG+74jPv=Tgf31d|ZOG%Vw`|*)o=4|=y(K8|fBpZop?EWCZQ_4aSN0T%>#S;3cFJzR zbhXnW@8W-o&BZ;IqPM5^SP-+yn$D6^;#XE%6+8=KS*_U*c|2oDuN*&KAq%H0)QQ=$ zJ$;O9GoK4uY%5kda#m@k^;5iM!p_{y(3d!pkWQEhr8R?7*VQbJeO9B+&Jn+`Mh2&~ zU!Jt0LAH*ZSX|-6aYDScS`u<#S1n;$8i|)_&_N5 zDwn8%OLI59Z8!h51$v3GG7=EJs=0bD@NwXvPGKQ6Fp@$wL%zWoO~byzG6v6 zP+K%W?e)hYD=k_3riQFWx%SeUbo&Zp0udE-BOge2<41dbX{oXnW z9&zI2&sewaa(Eom*;7gDgw}_lIO7`gg|+9ds0G)yl^DGmPE*UYg|%F1t!*VP;y8cI zb}dto9gfmF+*6C8{(p4zfOxV}3K~mnn0X3nfrN{qA4&1Gk4yql4O zh$G@*OhYgOc|Xw^C}-8sZ!s{WV8GaGYq&%Lx~l{-_%s1C_)HHo@QlxFo*J%&vCp7v zhFa|Y+QLGp-($5=;~h3un|U;eDlae!wU=E%BUBrA(cv#IUkz%rT?*Pm1}VB7vEK>p55YIkgHP7 zec`{(qU728+9;vvPlg+^uoIrD$5th!2(Lc$!~r^SHC{oxXCGA0U8b75>}>Y!D!odr z3V662bqMaeps_eF8kncm6yyj$vlVET@5%fd;SSpdoWfxn)XbM{fr+ZLJ@%q)LI=2A zAYT}@X*I%6Z2ZHvc~TgPPW)rCu;EF8XiwTQakeex31#(1=k6EGb?467MuaD;MugAH zqoINGJ0Rq9g>@N3=3)s-AUR8uYM*n_rX!yiF+$>@13PE-?Nvg zSMM~|zk~yN_Tj1Zb?G}}Tk2@xd#rL|XD}k%R+kbVC^v1bBc}rluC?TkI9Q=5XPfI} z85#}muL3j*_uxg*ZF~5pd;jp{(!TMlt{%Ll`?hVR=^y(SY^ffC+;-wQ<9;(@@~~&J zmyvw|yx^}Yaxif_C!qx-l&d39^&T#l_}|uj>py%$n3NKxCzqm__+g#I+bSUfQ`_o` z>}u1d)wqh|$p>c;3hQI=$&y@hJmFCnw&X@OATq=Xpdljjt&dsd;YzX$VNw-Ek zP$z$mij;F@6zslG=09^q`%W;wL;KbHS3h{i(t{7(Xk{LfZhqlG+}KUE?^u1=eIyR7 zrs!--#n(q|U!wxBzBA@sLr}My;8HT}g2U)Wst2zY&RzR{eSg+n_is%HS8cnu`l;>r zJHNYqa>qXZpN@9=fAG>vJE)OK37sT2p?dq85FEc7^j?6p;4BSzEFm2h8biACLmC(@z^+Y+boUtD#TGj4u{HhaW$?EKK?bVt)a)8# zzCAiWD_xGbB}|X#OTHtS2jMILOZFG^PGPwI+;Y2rxd`eZ(+gdBY%Vw^z>Sjc4^GWp5gi{B8D9d{+gy&+plx0KJ1<>8Oyf7nUwn zJ>b|}lC-~RILfu!?Qa?0rrjHestnr$paVZK2*AG&67ZdddwPTMuoRCPAGMQi_L$w+ zwFn0hK~;}{4|#a(A>EL}2Wa;<1gT$GCO&5$?Pl7n0(rBgx%tm%?xrB4DR@g1Dl3Q*$1v!HB1A(8qfK*bC_} z58YUwoXA>C0l3n(TaP;d2;V+|m;FIK z!Uxm!3xjeJ&MZd{p+gqcBaC@}efnku7a(#a=D9(CwJK^%q#zcygdFG;?Giq(zXcBJ zBiv{`1aK5P=yo5}Gq)@P0E66M+<|)g2B2@I^5o_&xb2=0Zgv=RRfq#J;PE(jq#oYO z)2HQr?SQ%-M%zs2Jd8#wOgTymk2AuUqu)7x$PsWtn-slda3m-Bj~oc? zj7k4MuLDrGev=Z`Krm)ziIe~WpEaGBc8voqN?3XX5EBKnlSb&t)u<3=uo6htC!N#VItd5&@ zVeUgL^Q;2~uZDt|#oUWd_^YznI2N0fyH`$qkj=s@`hyd9ak7(*z3*f+{-a#TS&Tn9 zoC${p`B|dDu0t^t&t|a~ce2IYmrh)pb}8|glpFYCGYf1nHagnmV#DfipU-3asD4c` zm&=B2sy4tZUvz>4Ab;**VH^L5P3O}~FPzMr=!Jbm1DjmhEQ#TTd%1lq+lwXqAXRVH z8d)})$oG%bq1!Tkb05R+W>W*{+1PWeoT-&%_vUFrNqoDhq`8X`k2D5lg$@207G6s; zI|p>M#ax($3wKg$_TyAJyY$i#_#FX4o2*MQd{IG=PK8B{$dLdf8Q>30z4fFs@x}&1 zPzehgBFO}Sxg4oz>u(Y9!@%3HnQv*hF;S3(IPN-Op9^2`s&B~Ca+M8I6C`)S1>ppG zdvMT$5+>niF0}A-4e&QS;?fEmU1=~Wv^AJyFh4Z!*Q;mA$^VTR71KF zNBvAXD>mHVPhZ0>;ht&GE=mU`<}!~JX%I$R3^m6wY8_cHTUy(GF4ICNSX_#e75a*||jPQwSL#<=)$n}Sq3;nG5_LGS8y zAviSbDp0es7G*Q_qk1$F7(f%b3sn87{*iHCJJ5kR2iT+5^@N9Af*GKe+JNU=slgG} zJU;D`!%&Zax7+X?Nx^Eaa|3xfhx^(Egv_)$_BWU1QJu`!x$#xBxo&09^q|{g7J@hA~iHaT6XD zr8U9}ZtW<*uc-GG)O!cACsO}hHC|IlxkauA@V5lAhro}Lf>YIPe+D4ekK8~$C-}N1 zf*vR#^++%vVMbM8^^xGrj`S5{#O4Wi^D5vnM+A3sAWV!-@}@>u#s89vcLM%Wj}6sT z(}>%Irfq0cUNHcs><{allc@ko$b4(#W!eZTV0I`xk#bue(E)eV)Xb}!(MJ;E!A5R( zBZN01JlcpdDRHD#?iK&mmRWt-Y-k~fF+T!I1$Z_EaLyk#!x(n zCB>gLX)yE0kgjkaq1kiUiT#_|*+Uz#KCO{XS3aRLn}Gy3>S#F>XB!nMZS+7&biyYZ zqshvr374IWgze)xkLj1XfQHtqd0MWpNzA_?Fh)@B?ah`?4Zt`fGT#Ru0}u!lphvca z{m%$^-`EsDOdFx?oKj%wZ5sHDuWK?+){)Z9S3q+P&_jIz%TfL2jR12~TG@SirI~g& zAx$bE&NM*>g8G8>lqjCazajV!)*0r4X;5F*uNSwJBS}pB_{sqEl^H#7MSvLr8w3av zX=Wj0PK37&k8OWE?2jMk;!RAPG{aN8z7PnWB={A+YDxmkK$rkv7qAYR%O>^7@R)F~)YWpu8!ir|(!cltM7;@;4q6Q|48fDYkJnq(f{=t0slc%#e zUo*x40ef$uZZM$?NK<3w7_#S#MipY~$x0;DB?)g%fS@slctcGchNOJYM~UMUsVLg zx0Oqj3Iv-kK~9rZt-y9D5mbT)CN`~CiWj$5jv4qRtzxwq+8H3MXY!KL7W0o3zzP!= zYnDsFy&xgDTd65Gt>+KTqf86*J%Ud^I}d^pU&KrQTn8{(SbU+)Pjy59Ir?>*+;a<^ zNLyc<9Gq644jgryD!xje4b^Q+YXicl;$|CvuvOfmY!wv0_+p#->$Z>|scR08glENL zt%=Rz(`^wz#&8KK6^TB=&q!f&PFXk9HpY)A%ZIIR<8PGvU2D1wc?gMqu$F4g%NJ6u z@Fy-2K53QWOmYCk0K;RWmHm`Uqs%%K##N>Rj5o{bKqb!MP zl}y-v4>zyP)M+Ri{l*+Z(hWc;(EX2ikWGY~!lxWE@=IRxh=pwdN~_`bdn!i_Xt}}H zF))NPo+KVu5`~y##wOeE30}4!>d*`+h5;2aU*tqCXvI8bhxL+|=1eA8c{pQgobjkN zZK1$hggRm-o4Yb|s#@u2YvRSYxnk=6)$1gQau%7du;@izQ#npYZ6@c)a} zQF_hhYgbIt=TZ4XZFn9}Cn;}cEZTk3LT`pKZoJKt3u#MX2$PsGgUd0rU05BxDumt_ z=<$zaj$>`4&Ed65fhA}K1QON$D2U3a#{!9pIVq~lItnI!Ibdi&BwW*ug8Z^}ai%RI zR?!La@wS3_j|{Ej>o(A!0AWKr|8<)fY!AeJYyzJ5*p2P|X!{U)D1cUw_=YTFv*nrTX7_I@C4G+0GCH%Qv2EUZalbKBwRf^s)(qJwT1aY z=UND$ZfztIj0D0GcKtu!=?Eh>h0E5peEV8OxJrIWBATS9(f?_fJhqk=R?Lczt(6jh zz+!_*osta+eyZ^8hcu!<&MI6=LD_@pwP#rzfqws9!0Q}GVqvD?38#Lm(@X|dZR}fCg@N+chxt!CVWMQ_^vyx z<_0@#Dt>jx-K2;p08-`Z<_=h8K&tX8r+rvA!mhIn>$q=sXoY1Rm>@J-v#_bdk0ZXc zLu^;e9W29d>PXMyQXSC8;1p46hEW8~2RuQ^ zEbV}5zM%8cRL$yyMV$nltw6fj0r)SB1NSf*ke$|p^-Pov{J#rJ_}WfzRocN1b|~=J zMU84BGgt`iF;-Q<#; zbccX+P!NE=%gkfckfbia2*~7*z1gXLL*)+D@XyZ6JRe@w)=K ze25Aj8A}ia^e_p(LxA5J2z45PL5=4rz-TBJ!2I8S6#;I}l$FgG3YNeL5;2Vd+np>} zLc2w#8T`hO>L~Y67k-$4Q3mwSzePZlvM&vaeI@9;)McS` zjCLtP0HgnW%lMM&sBnh3AOvP7{Rv(lJ#-YZ9Z6X}GtiuH8D$IIM>atHn^JjixVh{v z28qVsf+Cso`VQTk?oKa({_pb2{Bb(MTqL0wP^x>Bg2tbC$Fy2mJ zd{BkEnr6g%7nVwNusi!TI&g+I^Q#e8rbpyRY+ovoxQkLaBdVnt$wr zFYfZvjBJSvHT7X1R3TcKfws!Lo^+ai#{jpbQwg&fd6t+*bFz_O4Bcy^2QzJR7YTw` z%EW|7$#_~{cGiG}8jCd6PWxwYP%iAQlnq$G|6&lIFU!~=;>!hS*Dnl;h4aJfVH{Zw z>-Zzz3g8+#EU2RVs38}nK@lp%Sp%qn6-9*J?u_h`m0udj_AsMyp&e#YcGqvh7(lA& z<@8P=)~$4KEV)8=CV>;nJ-uovye%(v7eWO!*HTs>4HJ}x&*9x}YH>Peuf;sYKh({Z p(GW=0*kz1FM0e*g?WJ+_LGGUsx{T=v&5Iq0@ diff --git a/scripts/__pycache__/mojo.cpython-38.pyc b/scripts/__pycache__/mojo.cpython-38.pyc deleted file mode 100644 index 2ac152f5cc4cf82771a7858325919ba1f129efe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5365 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 S*iU0@+$e06Duw%n%D(`7=V=`P diff --git a/scripts/__pycache__/mojo.cpython-39.pyc b/scripts/__pycache__/mojo.cpython-39.pyc deleted file mode 100644 index 330d2e56ae743ea5796e136233cdabe0fd26a45d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 zcmb_gOK%*<5uTozoqceZq9}@@_44RJNo#ADv?M#Wlh~0$QW0X&f~5GdvauO%56Pis zXVyKvlsOrm$EBW7@k~aMsk^!di=IEsJS!^0J7yZRt((v9@j`#!6v>iK?^`?IG4c7B@@$60Jr&F3T$w^bhgN{0e{h zk+E*l3Neko(&DdB-;o`ypODu3TA)vB=&5e7XccuWuZO9|C~Wh<<9#}iLa+E7^$6-e z!1k-kmxGB(yodU3zrcZQ@mD#jdaERX-y!_Q@H_kvYp^p5aB3U6&~oV-+W$tHYuGQZ z&BwDhu~qEVOU-H9i)`QPxIyG{yB}~@*mBvmuituW^|IXwduzg5T9)>u>6b3sHyw$- z2lm_NuZN=R1o4D2v*5`{3fJk{e&~>a)k}4j4skc?2(Kr-Fu03$Nw^>NJ>l}SJWyzr zuidzN=kD#kTHGcIkqm_!pZ#yF*G*BxVM$GRFH_6uko$tp5X_6X&}ay!n;KLM zDYNZPi1Fs)(>JnV?ZM=1HHR?p*T{Wn)C-~tL!w3l6qH_C|z*|Q$7;>N{B1AXwhpsILm zmRk0r??lTs6x7N=lEkm#4s*qGtTYRnCPQMdTzcd4%B|-|mG% z+KXYfIZ4pIHjX|A=YmYV{wq8ov&Rlt~44w5iXJOw6smdliM-c=GY64 zupcbb{>wI>7c4aegDFq@HL}APC~W7V^tvwAAwD)A?sF2S$PSz?&eImD#iO@`+j9i$ zP~22}>f>n%I~QDpZ1}2J>UZ5h-lC>Rk2{>VyM5WmE?#T9A9wtIHXcgbdc2{aCUvMZhM@@1Hj=17anz#trCl{xd!>&7p z$W7f6;fmXl(Nz5E^pp%kKbp#Ji%4yQW^WDY%<+Pw(2M?tLSv?0WmRS}J^OxdSp%9l zPps0OHq-xUjXuRG{~tKd8mUs!ORU5yhR(*B#fI64F#&HY;L$gu(D#FB5HF)d6Z6_S ziK2ttJouQP=n_&{dj&*-ynP=Vo3b}({k|q9xK5coVTm?|Y_qN_TAv`=kjUzr2BC;V zAJdL#ypR~Gwxq_3nZ`Kyl+To``4|~b<%ZI{ppdKm9_zJxPuQ6!%#KSR+7~AIs%vecei|O$Inn zlzLJ`h)U8(0BFmhR`!l(z5zN^ zo?)@HQX=rktB>^c3i+5+_S=N!9BkC?>qNoE@W5{EK70`i;2j{I+?h3jt1o1kqB^5} zc{l_Ok&Q?r$%-6GhPXk1Dk&XP5NU&b)RWdq6*C+mnIQA5_zcg!hGz$r zXJ5mM(Sc_Nm1p0BcW9qy=7t`9ix^T#F&tA?b$}%s(uYYJ{O#2)^Kn?$#Z00~NE{iA zF^(~G@mugF_KiXMh~s)$)>ek$p^7hmZbDnHCAFlaEPkpiehTfQxkc(Bi(i0u>}iV$ zRvY^dF;)6sDgCb?dwkm?^pO6y;GNi~Z*CaTH8tOpPesuX=kh3mg6{L%_7GWP!w}cN zv-jFlm%^#}R2K{1Q8K%&u7~)Qo0Nh99Rd4zhHu=C=dQZD;E#hesO|*YQ&8ph)tm9p zl^*wyAOS6qihCiXI-w9q2L9S9K+OBd`F#QKhvcuaK1Rs}lm~P1tN+8`b8lU}^DCwQ zPCWmg^)K%6Tq)Z$pBxNfLe8Re#REt1Xp8Ra)bc$keHX}}ys#$SPyh(4@!rmZ<#g@` z;RE00O8^Fu7rTUT24Jyizl-aWAi{tZ|5W+8=m3f+1iZ__vkc7SQO)jQR#BtR#D|rY zWhb&1TsO!Nnakso`;2EuZLktb`A$5H+z#|dev!Q5{yDxd=ZQ$#*Dz1}0SvD?KE_^h zrJ6uyiDuY@qym6EbR)Im0KF1fJ=XwE2dblRHMafRN3)8M${P;ttyrj02lu(AYY_I zH@cMNl+W~dhU@BCpiZ^grzX*d7? diff --git a/scripts/arm.sh b/scripts/arm.sh new file mode 100755 index 0000000..f97c964 --- /dev/null +++ b/scripts/arm.sh @@ -0,0 +1,8 @@ +# Cleanup old files +rm -rf arm-none-eabi + +# Download and extract latest arm toolchain +wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -O arm-none-eabi-gcc.tar.bz2 +tar xvf arm-none-eabi-gcc.tar.bz2 +mv gcc-arm-none-eabi-9-2020-q2-update arm-none-eabi +rm arm-none-eabi-gcc.tar.bz2 diff --git a/scripts/create_disk.py b/scripts/create_disk.py deleted file mode 100755 index d2f7a70..0000000 --- a/scripts/create_disk.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python3 -import math - -pageSize = 128 -sectorsPerTrack = 256 -blockSize = 16384 -pagesPerBlock = 128 -maxDirs = 128 -dirBlocks = 1 - - -def addBootloader(name): - loader = open(name, 'rb') - b = loader.read() - - if len(b) > pageSize: - raise RuntimeError("Bootloader binary cannot be larger than one page") - - out.seek(0) - out.write(b) - -def addOS(cpmName, biosName): - cpm = open(cpmName, 'rb') - bios = open(biosName, 'rb') - - b = cpm.read() - out.seek(pageSize) - out.write(b) - - b = bios.read() - out.seek(pageSize + 0x1600) - out.write(b) - -def seekBlock(i): - # Blocks start at track 1, sector 0 - out.seek(pageSize*sectorsPerTrack + i*blockSize) - -def initDirs(): - seekBlock(0) - out.write(bytearray(([0xe5] + [0x00] * 31) * maxDirs)) - -fileCounter = 0 -allocationCounter = 1 -def addFile(filename, n, t): - global fileCounter - global allocationCounter - - if fileCounter > maxDirs: - raise RuntimeError("Max dir entries has been reached") - - if len(n) > 8: - raise RuntimeError("Filename cannot be longer than 8") - - if len(t) > 3: - raise RuntimeError("Filetype cannot be longer than 3") - - f = open(filename, 'rb') - b = f.read() - - total_records = math.ceil(len(b)/pageSize) - records = (total_records - 1) % pagesPerBlock + 1 - extends = math.ceil(total_records/pagesPerBlock) - - if extends >= 8: - RuntimeError("File is to big to be stored in one entry, multple entries are not implemented") - - seekBlock(0) - out.seek(32*fileCounter, 1) - - # Write user (assume 0 for now) - out.write(bytearray(1)) - - # Write the name - out.write(n.upper().encode("ascii")) - out.write((" " * (8-len(n))).encode("ascii")) - - # Write the type - out.write(t.upper().encode("ascii")) - out.write((" " * (3-len(t))).encode("ascii")) - - # Write extend - # @todo This is actually wrong, as the order is EX S1 S2 with S1 being unused, however we never deal with files that big - out.write((extends-1).to_bytes(1, byteorder='little')) - - # Reserved byte - out.write(bytearray(2)) - - # Number of records - - out.write(records.to_bytes(1, byteorder='little')) - - allocationCounterOld = allocationCounter - # We are assuming one block per file for now, so we can use fileCounter - for i in range(extends): - out.write(allocationCounter.to_bytes(2, byteorder='little')) - allocationCounter += 1 - - seekBlock(allocationCounterOld) - out.write(b) - - fileCounter += 1 - - -def main(): - # @todo Load the config from a file that we specify instead of hardcoding everything - # We can probably keep the os part hardcoded as that is not something we really need to change between different projects - global out - out = open('../tools/disk.img', 'wb') - - addBootloader('../cpm/.build/loader.bin') - addOS('../cpm/.build/cpm22.bin', '../cpm/.build/bios.bin') - - initDirs() - - addFile("../cpm/.build/MONITOR.COM", "MONITOR", "COM") - addFile("../cpm/bin/STAT.COM", "STAT", "COM") - addFile("../cpm/bin/MBASIC.COM", "MBASIC", "COM") - addFile("../cpm/bin/s.com", "S", "COM") - # addFile("../xed/.build/XED.COM", "XED", "COM") - -if __name__ == "__main__": - main() diff --git a/build-mb.sh b/scripts/microblaze.sh similarity index 96% rename from build-mb.sh rename to scripts/microblaze.sh index 9eac9af..8c25c78 100755 --- a/build-mb.sh +++ b/scripts/microblaze.sh @@ -7,6 +7,9 @@ # Current version is tested on Archlinux ## +# Cleanup old files +rm -rf microblazeel-xilinx-elf + TARGET=microblazeel-xilinx-elf PROGRAM_PREFIX=mb- @@ -17,7 +20,7 @@ INSTALL_DIR=$CUR/$TARGET CORES=12 GCC_URL=ftp://ftp.nluug.nl/mirror/languages/gcc/releases/gcc-10.2.0/gcc-10.2.0.tar.xz -NEWLIB_URL=ftp://sources.redhat.com/pub/newlib/newlib-3.1.0.tar.gz +NEWLIB_URL=ftp://sourceware.org/pub/newlib/newlib-3.1.0.tar.gz BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.xz GCC_FILE=$(basename $GCC_URL) diff --git a/scripts/mojo.py b/scripts/mojo.py deleted file mode 100755 index 1234bc0..0000000 --- a/scripts/mojo.py +++ /dev/null @@ -1,282 +0,0 @@ -#!/usr/bin/env python3 -###------------------------------------------------------------------------- -### Mojo.py is a bitstream uploader for the mojo v2 board -### author Matthew O'Gorman -### copyright 2013 Matthew O'Gorman -### version 2.0 -### ### License : This program is free software, distributed under the terms of -### the GNU General Public License Version 3. See the COPYING file -### at the top of the source tree. -###------------------------------------------------------------------------- - -import time -import sys -import argparse -import serial - -# Try to rename process to something more friendly than python mojo.py -try: - import setproctitle - - setproctitle.setproctitle("mojo") -except ImportError as error: - pass - - -def main(): - Version = "Mojo v2.0 is licensed under the GPLv3 copyright 2013 Matthew O'Gorman" - - parser = argparse.ArgumentParser(description="Mojo bitstream loader v2") - group = parser.add_mutually_exclusive_group(required=True) - group.add_argument( - "bitstream", - metavar="BITSTREAM", - nargs="?", - help="Bitstream file to upload to the Mojo.", - ) - group.add_argument( - "-i", - "--install", - metavar="BITSTREAM", - dest="install", - action="store", - help="Bitstream file to upload to the Mojo", - ) - parser.add_argument( - "-r", - "--ram", - dest="ram", - action="store_const", - const=True, - default=False, - help="Install bitstream file only to ram", - ) - # not currently supported by the default firmware of the board - # group.add_argument('-c', '--copy', metavar='BITSTREAM', dest='copy', action='append', nargs='?', - # help='Bitstream file to copy from the Mojo [Default: %(default)s]', default=['mojo.bin']) - - # group.add_argument('-o', '--only_verify', metavar='BITSTREAM', dest='only_verify', action='store', - # help='Read flash of Mojo only to verify against bitstream.') - # group.add_argument('-r', '--reboot', dest='reboot', action='store_const', - # const=True, default=False, - # help='Reboot mojo board.') - parser.add_argument( - "-v", - "--verbose", - dest="verbose", - action="store_const", - const=True, - default=False, - help="Enable verbose output to cli.", - ) - parser.add_argument( - "-V", - "--version", - dest="version", - action="store_const", - const=True, - default=False, - help="Display version number of mojo.", - ) - parser.add_argument( - "-n", - "--no-verify", - dest="no_verify", - action="store_const", - const=True, - default=False, - help="Do not verify the operation to the Mojo.", - ) - group.add_argument( - "-e", - "--erase", - dest="erase", - action="store_const", - const=True, - default=False, - help="Erase flash on Mojo.", - ) - parser.add_argument( - "-d", - "--device", - dest="mojo_tty", - action="store", - default="/dev/mojo", - help="Address of the serial port for the mojo [Default: %(default)s]", - ) - parser.add_argument( - "-p", - "--progress", - dest="progress", - action="store_const", - const=True, - default=False, - help="Display progress bar while uploading.", - ) - - args = parser.parse_args() - - if args.version: - print(Version) - sys.exit(0) - - # Serial code - try: - ser = serial.Serial(args.mojo_tty, 19200, timeout=20) - except: - print("No serial port found named " + args.mojo_tty) - sys.exit(1) - - # if (not args.bitstream and not args.install and not args.copy and not args.erase and not args.only_verify and not args.reboot): - if not args.bitstream and not args.install and not args.erase: - print(parser.print_help()) - sys.exit(1) - if args.erase: - if args.verbose: - print("Preparing to erase") - erase_mojo(ser, args.verbose) - sys.exit(0) - if args.bitstream: - install_mojo( - ser, args.bitstream, args.verbose, args.no_verify, args.ram, args.progress - ) - sys.exit(0) - if args.install: - install_mojo( - ser, args.install, args.verbose, args.no_verify, args.ram, args.progress - ) - sys.exit(0) - - -def display_progress(p, width=30): - if p > 1: - p = 1 - if p < 0: - p = 0 - bar_width = int(width * p) - rem_bar_width = int(width - bar_width) - sys.stdout.write( - "\r[" + ("#" * bar_width) + (" " * rem_bar_width) + ("] (%d%%)" % int(100 * p)) - ) - sys.stdout.flush() - - -def install_mojo(ser, bitstream, verbose, no_verify, ram, progress): - file = open(bitstream, "rb") - bits = file.read() - length = len(bits) - reboot_mojo(ser, verbose) - - if ram: - ser.write(b"R") - ret = ser.read(1) - if verbose and ret == b"R": - print("Mojo is ready to recieve bitstream and write it to RAM") - elif ret != b"R": - print("Mojo did not respond correctly! Make sure the port is correct") - sys.exit(1) - - if not ram and no_verify: - ser.write(b"F") - ret = ser.read(1) - if verbose and ret == b"R": - print("Mojo is ready to recieve bitstream and write it to FLASH") - elif ret != b"R": - print("Mojo did not respond correctly! Make sure the port is correct") - sys.exit(1) - - if not ram and not no_verify: - ser.write(b"V") - ret = ser.read(1) - if verbose and ret == b"R": - print("Mojo is ready to recieve bitstream, write it to FLASH and verify it afterwards") - elif ret != b"R": - print("Mojo did not respond correctly! Make sure the port is correct") - sys.exit(1) - - buf = length.to_bytes(4, byteorder="little") - ser.write(buf) - ret = ser.read(1) - if verbose and ret == b"O": - print("Mojo acknowledged size of bitstream. Writing bitstream") - elif ret != b"O": - print("Mojo failed to acknowledge size of bitstream. Did not write") - sys.exit(1) - - if progress: - for i, bit in enumerate(bits): - ser.write(bit.to_bytes(1, byteorder="little")) - display_progress(float(i + 1) / length) - sys.stdout.write("\n") - else: - ser.write(bits) - - ret = ser.read(1) - if verbose and ret == b"D": - print("Mojo has been flashed") - elif ret != b"D": - print("Mojo failed to flash correctly") - sys.exit(1) - - if not ram and not no_verify: - ser.write(b"S") - if verbose: - print("Verifying Mojo") - ret = ser.read(1) - if ret == b"\xAA" and verbose: - print("First Byte was valid getting flash size.") - elif ret != b"\xAA": - print("Flash does not contain valid start byte.") - sys.exit(1) - ret = ser.read(4) - flash_length = int.from_bytes(ret, byteorder='little') - 5 - if flash_length == length and verbose: - print("Flash and local bitstream match file size.") - elif flash_length != length: - print("Flash is not same size as local bitstream.") - sys.exit(1) - ret = ser.read(length) - if ret == bits and verbose: - print("Flash and local bitstream are a match.") - elif ret != bits: - print("Flash and local bitstream do not match.") - sys.exit(1) - if not ram: - ser.write(b"L") - ret = ser.read(1) - if verbose and ret == b"D": - print("Mojo has been loaded bitsream") - elif ret != b"D": - print("Mojo failed to load bitstream") - sys.exit(1) - return - - -def reboot_mojo(ser, verbose): - ser.setDTR(True) - time.sleep(0.005) - for i in range(0, 5): - ser.setDTR(False) - time.sleep(0.005) - ser.setDTR(True) - time.sleep(0.005) - if verbose: - print("Rebooting Mojo") - return - - -def erase_mojo(ser, verbose): - reboot_mojo(ser, verbose) - ser.write(b"E") - ret = ser.read(1) - if verbose and ret == b"D": - print("Erased mojo successfully.") - elif ret != b"D": - print("Failed to erase Mojo. Error code: " + ret) - sys.exit(1) - ser.close() - sys.exit(0) - return - - -# main() diff --git a/scripts/upload.py b/scripts/upload.py deleted file mode 100755 index 6898986..0000000 --- a/scripts/upload.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python3 -import serial -import os -import subprocess -import sys -import time -import argparse -import math - -import mojo - -def progressbar(it, prefix="", size=60, file=sys.stdout): - count = len(it) - def show(j): - x = int(size*j/count) - file.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), j, count)) - file.flush() - show(0) - for i, item in enumerate(it): - yield item - show(i+1) - file.write("\n") - file.flush() - -def upload_rom(filename): - # ser = serial.Serial("COM3", timeout=1, write_timeout=1) - ser = serial.Serial("/dev/ttyUSB0", timeout=1, write_timeout=1, baudrate=115200) - if ser.is_open: - ser.write(b'\n') - time.sleep(0.002) - - print("Init") - ser.write(b'#') - time.sleep(0.002) - ser.write(b'u') - time.sleep(0.002) - ser.write(b'\n') - time.sleep(0.002) - - print("Target") - ser.write([0x01]) - time.sleep(0.02) - - print("Length") - size = os.path.getsize(filename) - ser.write([size & 0xFF, (size >> 8) & 0xFF]) - time.sleep(0.02) - - print("Data") - with open(filename, "rb") as f: - ser.write(f.read(size)) - - while ser.out_waiting > 0: - pass - - print("Done") - - ser.close() - - else: - print("Failed to open serial port") - -def upload_i2c(filename): - # ser = serial.Serial("COM3", timeout=1, write_timeout=1) - ser = serial.Serial("/dev/ttyUSB0", timeout=1, write_timeout=1, baudrate=115200) - if ser.is_open: - ser.write(b'\n') - time.sleep(0.002) - - print("Init") - ser.write(b'#') - time.sleep(0.002) - ser.write(b'u') - time.sleep(0.002) - ser.write(b'\n') - time.sleep(0.002) - - print("Target") - ser.write([0x02]) - time.sleep(0.02) - - print("Address") - ser.write([0x29]) - time.sleep(0.02) - - print("Length") - size = os.path.getsize(filename) - ser.write([size & 0xFF, (size >> 8) & 0xFF]) - time.sleep(0.02) - - print("Data") - with open(filename, "rb") as f: - ser.write(f.read(size)) - - while ser.out_waiting > 0: - pass - - print("Done") - - ser.close() - - else: - print("Failed to open serial port") - -def upload_bload(filename): - # ser = serial.Serial("COM3", timeout=1, write_timeout=1) - ser = serial.Serial("/dev/ttyUSB0", timeout=1, write_timeout=1, baudrate=115200) - if ser.is_open: - size = os.path.getsize(filename) - - print("Size: {} ({} pages)".format(size, math.ceil(size/256))) - - input("Press enter to start upload") - - with open(filename, "rb") as f: - for i in progressbar(range(size), "Upload: ", 40): - byte = f.read(1) - ser.write(byte) - - if byte == b'#': - time.sleep(0.002) - ser.write(b'#') - time.sleep(0.002) - ser.write(b'\n') - - time.sleep(0.002) - - ser.close() - - else: - print("Failed to open serial port") - -def upload_sd(filename): - # @todo This does require /dev/sdb to be accessible without root - file_in = open(filename, "rb") - file_out = open("/dev/sdb", "wb") - - file_out.write(file_in.read()) - - -# @todo For now we just wrap the existing mojo.py tool -# At some point we should rewrite it from scratch -def upload_mojo(filename): - # Serial code - try: - ser = serial.Serial("/dev/ttyACM0", 19200, timeout=20) - except: - print("No serial port found named /dev/ttyACM0") - sys.exit(1) - - mojo.install_mojo(ser, filename, True, False, False, True) - -def main(): - parser = argparse.ArgumentParser(description="Upload binaries to the z80 computer.") - parser.add_argument("filename", help="file to upload") - parser.add_argument("--rom", dest="rom", action="store_const", const=True, default=False, help="Upload binary to rom") - parser.add_argument("--bload", dest="bload", action="store_const", const=True, default=False, help="Upload binary to bload") - parser.add_argument("--mojo", dest="mojo", action="store_const", const=True, default=False, help="Upload binary to mojo") - parser.add_argument("--sd", dest="sd", action="store_const", const=True, default=False, help="Upload binary to sd card") - parser.add_argument("--i2c", dest="i2c", action="store_const", const=True, default=False, help="Upload binary to twiboot") - - args = parser.parse_args() - - if (args.rom): - upload_rom(args.filename) - elif (args.bload): - upload_bload(args.filename) - elif (args.mojo): - upload_mojo(args.filename) - elif (args.sd): - upload_sd(args.filename) - elif (args.i2c): - upload_i2c(args.filename) - else: - print("You needs to specify a target") - -if __name__ == "__main__": - main() diff --git a/setup.sh b/setup.sh index 9b93094..d731858 100755 --- a/setup.sh +++ b/setup.sh @@ -1,20 +1,8 @@ #!/bin/bash + # @todo Check if all the required programs are installed -# Cleanup old files -rm -rf arm-none-eabi -rm -rf env -rm -rf sdcc-code +./scripts/arm.sh +./scripts/microblaze.sh -wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -O arm-none-eabi-gcc.tar.bz2 -tar xvf arm-none-eabi-gcc.tar.bz2 -mv gcc-arm-none-eabi-9-2020-q2-update arm-none-eabi -rm arm-none-eabi-gcc.tar.bz2 - -./build-mb.sh - -svn checkout svn://svn.code.sf.net/p/sdcc/code/trunk sdcc-code - -python -m venv env -source env/bin/activate -pip install pyserial imageio +# svn checkout svn://svn.code.sf.net/p/sdcc/code/trunk sdcc-code diff --git a/source.sh b/source.sh index 49414cf..ff9c678 100644 --- a/source.sh +++ b/source.sh @@ -1,4 +1,2 @@ -# This order makes it so we can use deactive to also deactive the other additions to the path -sudo chown tim:tim /dev/sdb -source $(dirname $(readlink -f $0))/env/bin/activate +# Add all the tools to the path PATH=$(dirname $(readlink -f $0))/arm-none-eabi/bin:$(dirname $(readlink -f $0))/microblazeel-xilinx-elf/bin:$(dirname $(readlink -f $0))/bin:/opt/Xilinx/14.7/ISE_DS/EDK/bin/lin64:/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64:$PATH