From 3e17ac840cfc7e4c99d67ee24ff1d73ebda75c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 7 Jun 2016 08:10:18 +0200 Subject: [PATCH] Kernel Rewrite #6 --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.DEV.po | Bin 0 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.S.QC.txt | 63 ++--- A2osX.S.txt | 390 ++++++++++++++----------------- A2osX.STARTUP.txt | 18 +- BIN/ASM.S.FIO.txt | 6 +- BIN/ASM.S.txt | 2 +- BIN/EDIT.S.txt | 6 +- BIN/LSDEV.S.txt | 30 ++- BIN/MD.S.txt | 3 +- BIN/NFSMOUNT.S.txt | 109 +++++++++ BIN/TEST.S.txt | 2 - DRV/CONSOLE.DRV.S.txt | 44 ++-- DRV/DHGR.DRV.S.txt | 68 +++--- DRV/MOUSE.DRV.S.txt | 18 +- DRV/UTHER2.AI.DRV.S.txt | 11 +- DRV/UTHERNET.DRV.S.txt | 22 +- DRV/UTHERNET2.DRV.S.txt | 3 +- INC/A2osX.I.txt | 97 +++++--- LIB/LIBTCPIP.S.TCP.txt | 31 +-- SBIN/DESKTOP.S.txt | 35 ++- SBIN/GETTY.S.txt | 42 ++-- SBIN/INSDRV.S.txt | 4 +- SBIN/SHELL.S.CMD.txt | 21 +- SBIN/SHELL.S.txt | 3 +- SYS/KERNEL.S.BIN.txt | 11 +- SYS/KERNEL.S.CIO.txt | 1 - SYS/KERNEL.S.CPU.txt | 200 ++++++++++++++++ SYS/KERNEL.S.DEV.txt | 79 +++---- SYS/KERNEL.S.DRV.txt | 42 ++-- SYS/KERNEL.S.ENV.txt | 53 ++--- SYS/KERNEL.S.EVT.txt | 21 -- SYS/KERNEL.S.FIO.txt | 14 +- SYS/KERNEL.S.GP.txt | 141 +++++++++++ SYS/KERNEL.S.INIT.txt | 190 +++++++++++++++ SYS/KERNEL.S.IRQ.txt | 35 --- SYS/KERNEL.S.JMP.txt | 157 +++++++++++++ SYS/KERNEL.S.LIB.txt | 12 +- SYS/KERNEL.S.MEM.txt | 31 +-- SYS/KERNEL.S.MLI.txt | 15 +- SYS/KERNEL.S.RUN.txt | 107 +++++++++ SYS/KERNEL.S.STR.txt | 85 ++++--- SYS/KERNEL.S.TSK.txt | 81 ------- SYS/KERNEL.S.txt | 501 +++++++++++++++------------------------- X.PRINTF.S.txt | 177 ++++++++++++++ _MAKEDIR.txt | 5 +- _MAKESYS.txt | 2 +- 48 files changed, 1868 insertions(+), 1120 deletions(-) create mode 100644 A2OSX.DEV.po create mode 100644 BIN/NFSMOUNT.S.txt create mode 100644 SYS/KERNEL.S.CPU.txt create mode 100644 SYS/KERNEL.S.GP.txt create mode 100644 SYS/KERNEL.S.INIT.txt create mode 100644 SYS/KERNEL.S.JMP.txt create mode 100644 SYS/KERNEL.S.RUN.txt create mode 100644 X.PRINTF.S.txt diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index 1af43bffa123914231369cb2e4e11fa9a4ef5770..2a0bb6601fe603f51ff14c9e5f5fac94f55a6c00 100644 GIT binary patch delta 17385 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 z zG?JAc7Kos$@cVA>=YQ{qs5IUX^nrY6o z=Z=DvmSulw6uhxa``%G}9C_=P3DX000&NfXTEkA0v|_N!Uf+HAW^( zi^l(-fDqU~tDZ_mImJ)!C@g~?tirEP6EM=}V`Q8Hd4F2Eq09>_c)D;qTKM=! zN)d?-BDjx=7RjeKgTbVNHn2=9$DIbLk|c?v1pG$@84-fRfHTu!y}l8G{+q#_z@J#O z4sC#l?jI1mO(~dUd}4DWf_oX5&Q$O1i98ZiZ)mG^e-py0cYI+cTq@)HKrCiJc|+TH zu$)w;w1TJM$GIpAjSmd1&xW6?qupp(?jx~jg}b&w`~anuZh59`$Fo~XHk1XzWyy{w Twia(q-D3a2M5@~yS>pc#MKejo delta 17610 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 U2oNAZfB*pk1PBly@P7*Y4G8}Qt^fc4 literal 0 HcmV?d00001 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 6ffee0e03dba4fca01bd9900d8f6b8ad7fd3ca55..15a7cbfc4cacb61d4a4e97eb6db92f1505df195c 100644 GIT binary patch delta 117122 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 u6XDSz`*Elcl`v(7JP?q$Q)j)HWOxJ!z! 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

CI}4h+2h}r?qHXw#XP`4Ho$} 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 delta 114649 zcmZ@>2Yg(`(ceA$5)#rNBqSjL0)!GE)Ko(K{Lv2bx*b|B~YwXUxRT$#y#P*qcoL2;VqA zZ{E@Dn($BN=g+@3yTTFvV16DjEp>+N<~;w=>`a%56*X4(^so2#8^}ISW~uDa9Qh|O zb@Tl`Ll8Xh)h_ifFdhbE>mpZu%uDK9R7p(G5dDL0@)>YNjUwW?vBP~&ktl*Iz-NX^K0Q0(@76#+veln7IElB z^MVH-N%)4R?2R*!ox8m-+vW~Gle9eLR^8@FzPeA z_hi@G!}p@TFx%=5{~`JGlmq!j?O8pSXIE{lryq@;h&@&pVE_Ul-=JiJF(jyw51lZ zec8z_FyW&vnq)1^O(hSc9x^3cBi;YI4b%DH4UUsI<}=?O{>s@iexqLRVt=>+8xzS-IH}UY>3jedXqA5j<~xs>z)s&cDRu;>qF5pLNEku+par7qV-~L!(ea_i;o-^s{?^r@{Hn^zO6GIwm8-fsdm38~ z%9?7bNq2?)8EM=dUYSwLJ>d}k>kU7aQD#d@v8CD_PM6!`^`)g}WM)0cO&{}$j=t8$ zmdYwt;A2hWj9 zWkX|!-di(-MRnZG3bWcI>fDLXPcygQUv z$;@Tw%T><&Rbq5_FjTB#Eh*p491Gczsp&{rHI-?8c4TC1H?vl-Bb&woA%7J!R{}$7 z6_pPeM3q&s)avMxYLsX-?8tCn7qc$f9BJ&RWk*imKA{hh_yM>&#nbfqC^l6c+B7m9 z>g((2YU*B9#S$CPZfY{r-qY2}TuUSe8rOG(y82i6`v)3Vv{o|5(y%Sh9$Xe%x1qnQ zwTn5HtLD9vBV*Ie{nL|;>sj&%#FW8MS7UQ~M+WsywkFATwR@M_+r;n|7Za?0>a8I6x_lI97wD%1t_PW*>A{&@)-*||Io>$9k zYt^JHnQh<5Qr58}6I%xlOzfE28p7YH>ti}aiDLty4Q^Cu?I*_6H}|e#j+5q6lzFl$ zqbaXlTv@$$LugqDz@h2g69J~3f|am)kR_hVj*NppdHJG+!YMWCBzJ2WUei0?$xLb)Yh#LIdzT99+jNZ)92!| zY%``*8&w>!Z8ug|rY>8~u~^xX1M!ZFuV3Mwv75i+uX2xbYHp|Q z9paQ%F}|I|p|cEy)7ah8(^XZArDr}9?X_JrlM_ta4XD5fGoOXRq_dg7TF}~B+tkUd z=b-b6(U8BIC7*|is>4Q2LJ&3EM^ID693kS?E~tXrm;}3z+=4}f71wRnfVH$ z;7aCSJVQa49f?qL)y(gdt7l<79E;T~fXZ?W^VcpA6QdK%eXYoxGPzQ&qvGqCzfMdA zhM4;XF?dRx)17!DSifl~l!u**X*Vh1^xjOBjt0zA;!#y!LG{*K(ACgT$Y0OQw*sB} zHk#dCvu2lhZx=tDGI@@>L+RUy2>184wze?qoj`&W?r)ba|ZPnQqoy-V1p zO`htzqgFaC#i@xvV3;P?{he9ML*e$_BTk$)dHHuqE?wrHRm^cOse<_Xl;9WM9}eXg z1Rt0yuL%#TGBQG34`G*VX@pYk?0^N@+t=FGv7WgfR;AH}*qSYm5KpF{FddI7A&lCo zS=wXK99rG%Z}Rs~mtjLLTg0s2BX|g574v-GSddYTp)E3g5biBV?|j_QIrWt+@rR1g z=AJbJOnX9Ye%h1zM)nklQJY}W(>h$A1pJX=K<qcc-H1)H8Z7^} z(zYP4skK$LO#M#;mtLa%SI704j;n^*J~vpRn^@WxI>){Ye^`{W@T<8~nf$dXYaQFM zeN`9JzEKSd7!NNk_6C(5MgqgRG}fYpHE|w4vb?3WY0ZkBMrNMRkFW%@f+C$@i{lZU zuzF3$083q<3Q$RZlP1u(ZaQi4T%H^(7G4_a*)hF@*{r;DPmnB%%JL9d7c4aaB~(yF z1kC`m7>kwEoTwMIaVX0iAEa&|LfvIVUJk-?O656z53)5^I z8|yGjOyy8Dtz@<|G%(H1j|`0tu|x+yGB^y~pAYIaClwB}OczE$n^MDmup*~CbY>v5 zb#P}uQC;NWVsfXcAk9k%X~ShnJ}{!E7xhG5SsE7)>@<}G(~VLZnlA%LNiQ|*KXZI? zTVObc#!T?8EH3xi-OH*&3zr+?_GByc`K^unr>OI@CPMhl(sD2!m=m&mdVDevstk>c z$*SaBUV4q9qYpjK^XGAK@|mV`Q$80LpJ}SL6-4TZqO?LTo;%az-B3grcS($s;2+`C zJF^ypXwm}>%v=I-aF!aRRuQRchRkKCv6ORvgP5G2V%kDAJ5E0jKV57OR1p71n7xw5 zGZ?}_zjvUozorGVT?Kx_a@UJ0TdJ6~TIUiJPtEKG*o&QuW;a1$!D1e6D9Q8Gf(~09 zm#3y(gtfVQfK@l}@N`LK=MqdbogDJpYFOe@g(WY)sfJmPLzi?;sA1-1z@ROsF+xWi zk8)*pnNOhdMt+2hiSi~M{-mTd*i7RZVp50sHcv8^QDORk`ZG}J0CHB@pZNQ}bMrSoMGGj~%*JwXmbiR4cor>&PTokf2t zOv$Th979IExev|k{V_Zxj@t(!6d3d3Tr(SrIKMU)F4!WEkLwgu%)RQpG(V+wVJBEe=Q&TxPOgmZU=PAHwIhCY}xb8Vk(F9Aj zdwe=H90*PahNiKuwL#ED^RP*^(}tAzWeiK@fc@r5xk~Y)d3-qF?;klUz|sRsN(Mub z;)s&Z+N=gD9T}wL_dR81eW{=XiYht+MQ*bwprpfo#Omv zjB`{W)lc%^r+GWtIL0{k8xnxX8J{JMt9H~sOvMTGLb|A)rJg~eVI1d!RX~zDsbFW& zCQccm-Hapfv@U&6csnGcS>jGZ;bC7&I&)^Ijm)|W&}5Zj58F+|oyB$2Gz$IM#xe?4 zwlUW^s(r+`k;Z{`uIfrVPoK#kka^ChnVdNXft3n41QaxVd-UnstESJf55m&X-Gq%; zdba)8%iQ~;%Ch0^_A95fc0jf9U%+Qv4Ht!9uF2sC!(Y`@^9#e3i^};$;gc6N&RcRZ z4lY-N z4s(&%u)uE;Tr6u?P-tqnCR|%v&yR%1Yl~ABUmHbn&#HsrJ8BCyW?m-?^#gC`L1l;I z3@tZJ`}M}ck|lE2ydkEDbie(^m?GL{GH>GIm51ZfgEybZkGVT+QsM~1_FO8h&yx?=q?5T ze@g)EPBqisZ}HeO$N|YDoPxit$c{QgFxOoKY^a<=WfByY<=qMt`?vc$>Sq*K)0#Gx zc29UoosWMvyrwSCdGB1r-uuFr)_F?qM@>_I2%SGb9Vvh1#j=-0%<`a7Tk%l%xjH|8 zIQ&&zQScE}TFsn~Qk&+^p8nR#s*ChdSROMPIld=p?``b{%Vcd0b9^7QIGe5N^0$qQ z2F3=r2bkvvs!XlKo{7L%(~ixXtC{8T2&NxKh^xNXZcz7xQC<3E_>uY&{#5w&`n=%N zsua}yXokA#2z5U;8aaMK)ynoW25fx>wRCcjj} z!^?XOk<##IMJ`MKW%#0oG|R6PRKu^iussx4XL^o{l@G;bW;_o(?fs#e>dKbN$^)G( zq2jjA#uX*yjjZ%HTZKp;>?&hUQPN0|3d zKmnOhdx&0xCQSRY>cjCe0HW0!qHr$9E3*n$^fK+$Fu$kgffF{G<}a$RUG(6oO-K2I z-!#9JeOj)c_4fJ)b~Sgk;J>op#nR7S@RU~R$NyPj#TxG~nWB zUE2z4G4VxJAYBVdzt{hu)yY!+5P|LJZtGzQI7gG9cl51hi8w#g@BY^A7G}fYS^Y84 z(c9d%f_eWeKHfLq!(SGk-f2mzd_|Fv`YP+ey1tw|=6!*wz%+CGMINXrx`3JO+tobK z$$YP|aMk&4(~8%_5AA5H=o@Hh9B3qaeD9V3;u*U-17lmJx3c6U)tpR57+W}YlGB~pQlgu|W>2)u zz%eaVSwB|0ZfL=YghS@^;BI-ooERNs2`+w|aw1j%t6N%i%+atB+4&bz`Bom$-9dxdgr}Iv= z0ol8_G&(MuQ9l|EmJ+l_2klj$#jCLl!(W|~&-=vD5sSSTC&t(rpaWyE+z9#V+tkq?JNc@T$YAq~+#K>uumN6LyLqwcw-qasZQ&W)=mbU3i4 zpXHnszT&*}OmbbFti&X`)_e-TfO$?0C!Xi#r%}hIw88N4=lSY!ETrx#Xs?8G0}9FC z*0P>ihxE>>nPd1EodwWYcDsHQjOl0#&DB<#YdPdlC*>~49YMn}P%;oFLCNcFih-U{ zQE`vO9i$VVeN1&$Y={q5(6}0oTw#eg@69YHocLmvlRWN8cexYiJmSy{9{9?Wao!_% zeT^mJ%oo9xx)W(BQEaR4+XQ^EEP?_M;ptGj0%vma2vv;`wv(b%$qSuapLf+=b~h|Vn+ z(yYNJ!mJlXX5V}>p|P}6O`5-oDW;SHgjjH?t=^A#a#>>|B^Di)3;I-{y40>w{)B`h=$hP3 z*ve9`n>{Di>vg_Cq1`w~-Q8qR4LyU?ozycA>~UF6Dn^o1=&AXoA*`XkflyDIvR6YZ zM#nb|j)r;%w*;t~Y4OS?aai=Y!HnaZC0Sw4AYlToYqG2o6l8v)@Wfg3vXjt3$Ji3) zN@k^d*Ta_!+kNxckiTP$d}ui-;>0*>cDzkBDoGXl;;h9R^bC?r2O1-3rn#}RGgRET zW_@RKXnH&(f0VFzr;a+s1=Qpw2B;rN04}%Q75<*-D$9dXaax=;t=Ox2bNk>4kEAi^ z{b0jQQ`Lp(qJ4q2V0nfyf=nGPjx?dR9b-e&BjaPtnZ-&EG@|p~!O6kxYKLK3Hlb*1 z?^wACNh)9P;6mokiSCS!bQlym%hhSgi>^k(gsQe9pM*$kn%ve7!5+nynNk3D)6t=+ zwW@Lf0@GXEoUowkjn!@^b*<=@Q0iT=0U~@(Wqx1HTQJ3H1+f#@a9(yT@|cAop1~m zA0R6U=MPv*aA;Pktbz1uVS9VNuOYbxHlj38{N%yX76EJ&V2kPBL6%ZWK_2Qa|Ec+H zp-A3IcD=~9TC)-wC~C3`tAx3ih{o5rBghh#fa4TFq>&DwGsSh_SY* zt|*MQ!l;V`w@}!Aj6$tLk(07=7AICI@@$} zE~;+cPciqwP4G%18-=CxQVThom&ja$)ffsXu0Hw~IS2g!atzS;jKEhvA`Xo#bB*|Z zf;A(!Rt;T0$D(RIbF8DX-TL{Lz&9{$y*`&4=wH~o8}(=#vQPAlT|?FhnK7P|X>i0( zP}aJ>W5B<%s~3!Qoubf2msSUv6Imv-NkxSQ!M(v_6ebT*;qK5x|McL{HkLY!uE|E$ z#}B<8z+h81&+xG7qUkAUXCiP4ziZ4Se0z`jh?T#3I!Na z6-Z|3m^?#QlNS-kQMXrT$37h+_APj8q#Fda`&F&`091T)PxnAyPbX%fc>vD9&=RIy zp!axCynr6NE@Vfr$@lavS<#DaXgsuOWDASG2urH1qnl|LE8t8dx6sfOE76_YSo(~ zXBss+d{P|untZ#&U)FI?cgb#9O9>1T+XXYN^Us!DpNl&9;Ol)(O*TMx$`jKJ8M2d*zD=PlvFXAhWKQo_$a+stiY`_Gpm$F%3?8QdP; z{_~7Yun#Evw1g~ye0cdP7q(QkwH-A2-Ow*B2kdI00ZQLs8Y~5B;B;de$Q|Qf5t!}@ zY~Py?%f;?73fm?F0hBf}r&pXYtT`%RC`5xd?e1u4WS;by(&5cpwvL>>ZFD=bk-DtN z>HbEHUuDijCj0M`sDq~6-SEOTGH-^sepvH}WM5ob&;ye|q3sTw*^7L}4UKytC(NE} zlv82z#O_9hd}19`77b3bR9FV8u`I#HZH8gMoQ2WF7~R0OF=l~jK(NThgEe4`BskqT zxka9OSt?8cqnJt?nO3Se!fxn?}Y!Vs&MRIm@HVVLE_z=7c4n(5x971vrWu zncZ&`5{8z^oyZ)h0Hu~yFaQ))7MK9~uj-_Fj3F9#9><22d_fuv#s3(7a$Jpj^=360pgvB+#k!5wz zugsy9QO$eCMsc!co>ft0Xsz-VL3QV`%0Yt}h6MAF6(JW7`UImRt$M`0!s0Hm_eRxI zqyelKDYqznV<8l2q5T(B}Cg|yyLh~}_4sC3w1U29Jp^CG`B8Wd%ausZmVVRl3+ zfEd9O<~TK~40x%G?2rf?$_7RddvR?NpI&2e`e1oP>RJMWqsWSfVr-;5*X$z}ndcg* zm*Z{%#5SgF*5w}-h^hx-Socy3?ICBT2WCiYjjnBAlFTg!?_ID_qAN&b8t1XJQE}H1 zi?3+AszrbXh6uso7fccLOPf&S~)bmbp+O-yE5Qc<8m$J(M?H>&UCYWWnQDfK*X=fV{&07OQ+jMc;livt+c8*a+ zg5Mt)oE+L3Vvci-Qqnk71IaiqrmPNypvDa&LebedGBu4AOX)(;?4e^66ZjsHbDhQ2 zvv*dtE|Jv$bE{Oa(X#Ao)S@GcYmXamfAzh_hrt13r{X^J? z#`*)JNMwK*HUrn?Mmx(DkzZGe)Eg|7LG2pV-f_fe-;A`X#(mfqnf+R$jACe1%pBLv zD#G}X`l`=L>J3J1dtjG@x8E3B0`SzEjG~snP*6eL994u8Kxs#Ht{^d1PWk?Pe&fbmOvP$9QJ#8w3+#{#49S&U2{q61O!!^$>BvQXQ;5tN2%!{5zu1s_pI0OzB} zvfCeOwEedE7V)Psrnn>Z^Zz^K?iZUtCWRQX_YK zsK2?dwY9sSxt@$JZdAq0{1mje^J#VD?DxZ1?%E_jRPC=#2`D3FRR!gM%Cz0xB z!Y{nwu>Lgi_s_zgyx<5v8~OX^M)QHGZIR}`Fsdm5R`&x_asly^Ieu+4(Pa}dW2C^& z23FD29TUv)o9ITGlC-+thF|*K;!MZyjJk+f#k3dY!H4;OAFh6}+~xSgT#&RshR=S{ z7yl9g?q=D43g7r*X3+Pt0XSQcSza*)rTv9YvxCh3ngJWJAGO!@syF6Tx!;__3O~87 z-!dSH8!7q{dRs|i);q%Eux1ATMqLlVdR21Sw`0uTii>LAch%`EPd~;fVZc>C&wB>a z7?r}j@5j)vs;|4Vx3RmUnK}M$G?}QUTjds|gWJqm_ zWq%@m?XYI?e~1qqRuBKDh;v%Y`M<>(Jtil1*5v;xQB~0UK0L^izO(H#v3+o0%u&|G|yWqJbNMMV4%r35JU78kXSDQP+i- z*Lh6bE6SP2_5UD8=+Qu~M<2yeuhkJuqo|P@s&2c=$!4h;s8As)eLg9+NUo>kEO_QA zkG5ZmYO)?=)S;X?iZn=Z7jE1l-iuJXHCLw{i8F{il0QKgxRgkku$G=ix!_X zXK5iq3ltb_iii#7Tq{y;bQdCzb8BVNs;88Tn|)SSudi^46B{pgJ2bMMCy$5w;wMB4i0J9@Bs{alDT6242A4_eE z6xCO@bo3*cX9XuuEke_seMmhV=;>=^HbhJHhP}9*h?FqIO!Wnkwu+)GauLUp(#))# zIw{pGr7MC#k%AEFY*G+SRYk!8gO*-Z6iv$NNRduTUxXBMKNyoX5K$_z^sHc3L|>)u zYQVj~2pUO`ZGGhLu8!b(Ts^WO{Hjyfj#RaNMv1yq5KRoCuX>RphO%_^MjbtCz)zN{ zhhQ-WEea0;u+Z$MBEvj_O)>s7y{JDJfwd3Lfa%Tcn+&kl2%C_}E0N7~VjrH{Ffa$o zycwi;wvZAdS`@z;`wQiU$t;N7>Y3^zN}$V6muZJ&u3WObH{AWlOh?_eNReTb>UW7Eu|8|OIE!D8~maRvpr zW187?3*BG8Pe$UIT{q8BfRqjyQBKzFbQF<~&2l4M79)L2*VJT)`DSH0lpSSJ_~{4^ z*Y8=OO;Lr&C+);lY-lf7>QotB*Unt9*k_lnWoB6K%nHMuyzdl8h2<`AL^l3^Sc2-)r2mk+);A?jz_z4K_MK zC%{4Guy&cN}^N~Sv*M!10i+nuGuRu8}NwwFH>{^IS7AS`tnRn$~AHTHK_metg= z^qbzp_1Pq7w|sy(N;V}2g3GJg~P_B$Eg7l53CPQTR|_dA_&FNR-x$5sA&WtS(y za+gZCC{)C(e~<14IhY6D{esW8Wm*yHZ61e^ZJr$8jx0^w4x^n;!iLv>wvM-l@B6GM zxJ{i4H{pKGrT{Jg1VY=#caDs0A=pl2^=ta`2o9SbewewE#*$KT(4??AA_EAU>mhHC z@n`}d`zcja=0TRS6yv>w)yI7;&=e*$gp*?#Mul^t3n2AQVEN~Y`+eoz1ksUcM z7`?L89F)muZEw%I*1k0ecY*J6W#Crmy1r(Xm~Zr2RmUm{!UPg+Xmri9@r6kd~ z{)m(GidJ0juL@Uu<*`+xr4?>vT~*~T3a|evF9@$P$+Vo>a>SWy^_XNGXp^~FEUAHR z=h2wp@PyM?ISAfeE=Ic^b8eNEKwH~KSD6Zu!L-%RRW9e%h2!H;Sg&z<4+@`b> z!kJ(Dcq9FhmDmhOrEL}w) zah(8hcZFa7+7;|3g4Bhr9+WzIWkX6SMZ8d@nWnBrSf7?wz4_AHWc> z!|5CW?E|DMMwsmaHF=l^6*+YtR00zl2fpwah1nNJ297zCIr)|T#+H`8vi#~c%v|av z>_|{?LBHL?+?Ph0$Y7HJc?iXlT?(+8C0?cr83iZ&m(w5EuJYR&_6?7R$flj19K^c} z-CZ5!O?|7%v2%yk!pAp0iFo`K7^VxC-0AXt5C>qrbNRGKSdCUMQ%`$bMN4TnOT1d& z6lrZ+4})zayAT&a+`UF=dL0+S=&47dOXNi@SRwLO8>|kaZ4d?rv%$n5{U1>Swi^{0 zkpOo*Yzr-le9tDq!N7TY2{AQkz^9zMB1sgtfDK|$7ZT|{?Q)v6w;^|cLwU220 zr*>0DjyRgl(=t59rl1F0jd*Bg9;EG#bZ&|xom8{`kxUR2m$iuGUmVTj9y@bDLCgKb zZ+P<`U7N)>bJL;~;>ioSOT3@WGg8|PMFAfRDMZ)GFn``*a<38OYnFf_e0-V+>mZM-Et5_|b$>DxK^qAGO{c?O1Vf8oe z*fl^8s+6B3ev%7@oGd=c<<6l~{y#u0XnJ!+QP6^JP9qKs>e?zaGibb`u*u*idXjGr zAyi2o*C8~i9u`~kcvV~gzbiJ=%=yIk^0?!qEk+|5Yo>s7!qypvYa^tU2buYFwDWFL zEQ%V=R*JAQ*QkL6mZ1!ZQxM&?UD)bP&bTo&b&rcH7IORi5L-AQPR!@!rZbqRn&$Ql zZHhDuT&&aj(nrv)waedxybI3`@teoEE8D!2UC+E{9<%d3EN7SaIG<J+Jr{bS{xA*Cd)_gThgeZiOcn6L!t)i8 z<`CLxd(`YA0Y#m|^w?15e(_`h&)^5ds|DN>yZ}B_66@$`zkpU%HA_DjT}M$YB+=@1 z+J$Njx-Wtm+wYH=N|>*BaHTYa$EJ{!I6WyxMORxqm!P!I4}FU_dr%PS3@nh>7|Jgd zXBR@u4v9Mpp$IM$FBI~&_{&un1y_jdBA(B$6s`16n5M|-VH)-wS}C;ekY5kaEI6qbm+MF)a5yiQJ-sr?4=uOhx89lHscHvN92X&3^@%-B*`!Odb_ zG0(Rh)h8XN%Ue*q{8n*EF<(}K?Spm(4V#AS4Lb#$?4s6q744d3cZz=$^U^Zx8cf4} zLAxd5M)JmkhD}0_0{g?vDDF|CxL3z}pD_xYKW9eqfCS2aNCCMXIp!#^AF$lV#Lr52 zPCT?fbyfO(@o5RT`~#6z%KiLtTH20eda*>|Zp2CZ331bD+?n(wyMSp>>@>Qfr^V%^ zyl~l%6c)#i6@2v4cKk%CfatP>XK0z?gtR!sYJMvIS<0(zIQ9`C=4U}%-p}bdo%=U) zx9BS4TKq2*Pm6ykPATI>IZ)~H6j-+(xq_iVJmH2YF3vZ{Gc(R|Eay3KM;XudKCiET z1Z9{N$2e*3RI#kz66bumaB^zDQ_F#_Pm!{NqU>ba@736{{y=bygwX?jJ#ENpB zoAf83)c&kyE$ihOe6Q&EUNzb@1K(eCe6J~duSe>D?+x)9@Fo70@V%+y6G!V!E>T&| z&51gRb?Ul1F*~-6<`S$8!C8qyh*vm7S9uVD)=HkUp!jDmvgf?uZrggcO`f6IN`74 zbz)&9Um*5X@ibXF4>1(+R0UrwZm8s%*k6V1<-dTQhq#F>=hhh%qP2?Wiq|Tz!JkXN z2(5THQubk_tf1O}JDGkFLUFZG#_bAYQ4NT4;HKoSu559gSf?4jnD!CuMC$RuHstK@ zL!tsb8$fsVLOZ2NPH$&mKgMxBk_4Yh&Vzox@|(yQrUrij<&`Z=2yeQ&oF|4ayV|ob zNzJbAUXclC>PeVn-O^6MRFjon#VS(6FJA4>v}0D_0FWj|p59I-Xf4DU))~$|>~Xsz zM-aUp*^JEP3HKa!_IUOA^y%}d=ds)I+9Alru8SrrbX15b zK{k5`M)DHo%@*g^bN3>94gj!00%SO_bBZ4KNkz{3p7o(MW824vM>dbp8w+{YUVp=l zH%(4$zUIia*IkeNx6cpv$HfU}*Mh$z2QL0_dz{%+m@i&j#0%U77&ck*2&xs5u*<`! zuUMok=3aW^aBymrQQFxgE{(;I?MF^|xn95U|Ec%u^%eh5eWhMsb?o|jR}BCtPNlO~ z&l_AsdT}@Nz!oL@Z#G%3TJic~?o6x$*6FDO&CPq5w?TZgguAy`m*{2v%(oOfdek)d z2lh*w9fywNl>9iCf&B`iqs6e1Eyy(sb;!v&UZ1S3WQQ>e^3nClYNW~XoYo{K29t>k zM=dO+IWl#08vrkns9y40qv(*CLi?40tqe2R3`h@Yn*{?K(X}ERf=!**EMgO*$4GEIwsA#* zk#3cDhHx+Cxe1d5D3^?DN=}DoT4bircb(wc0sER4qM!BDi(DGd+?D&xASjIEN^fI2~h21=pV+^R=y>jvj_KNQ= z<9W-I_TiM-9=Y1RKk6^zYB!R(Nf)PHV9fhTH(maXFf*zm2Q7Eai$wnY`U>yK?4l zd7Iq6EF39`M0>7^6v=4M)sbiq96mDIBh=W7t`RRS=ZJ@kZS~8Fk zoOd7|+HcgFu)IJ%6k25ozlDHFM@t>E!)nuyyAmAMG#PNp|6T$AI}A8|2h;ulM7X_a z`=i?RR1Y;+`Y*8+bY*!K9y<&>vV9CVpf=3BgqIDh*dbu&NyjJdm%n3A zUQ^Uli6#w)i9e3F<@jO&fHSii2YQ+9@6r6i;I$7Fdow>2o+h5L`6I== zs6ksl*4e#?X`d(~)2^F^QBWGJLdo5K#&V6>|3wdS5^p11$o#js4t*uUMpTLdmgIlM z>s#kLn?BRYo9LaA&jQ0lq=T*Th+G6k3d}<}IR+psMY3gmUr7d^@U^ZbztN?RDSObx zdF%StW&yYE+n!h{ICj zqQH@gKE*LBi(fbMbd!aPr&?h5CEgOJnXFtqeeFD7JhE)m*dJ-( zcAn{Sl62FE^b~YI(cyH_D0hWKZ7V;$%9*CdY(Vr5;)1_99jdx2L!a}e=;nLG%dOm( zN3TWec^5G)i?VLH?e;tF{MNVcx*HLd&$vi!=LNxRV@~S!lN-1V@30Ota}GN3=Eip4 zwqtaZwq}Nh)}!2CWKNTDz3iE%Ae zn2n*(07JNUZ_qrGf458tu6a2jI35UUB?8|Gu?T_&yMd)~E|w-8OEY0<0hT(6#n~E* zMT(5QZEpJ&di!>2-+}hZq2z?sq-G>2FGl#~l-OZLDb`1Z;pj8~6&y*gy=xAb)~)x` zgMJcv(NDu+C_wD|u(Ra$(5JSCjDFp?;^fj$rF)@FE>u-8fGvS9qG5PTx%nR zMCCzc6u8z!N@?(Vsc(Ix)ZnXbM7TCYYG}@Mco=Qe@jO;=qBy*Y=f|I<2+2QL{CE}5 zTM0u=m!rv@q_<{#osBs3!&D;&iEVH;)F!o};PHY-6vi9#4T~$f;B>PEW`QEZUdme< zj5ad<=lbMWB1}0_Aj)w83r_ZV`Yc2lFz1eq0Cr#Ys6rur*2%qb+d)v;n5Y6l@H>y| z1WZW3GdyNz7~M5@vJ5;S-35p8l<1~^rp2}{o*f5skNI}eh`jtv@eS~#%g3T=%d_o9 zbGTWsq7=(KXNlLk;F&vH5uR}lHAqiAcNSRbc?9MZP2JqFB!~_iFx!aty46M!N%!p} zw>*1{!73d=AIgA>l6m%u%e%ST4NGlSQ!v4|Up&zbiVqNs(~OehgW@0EyeRHMbmzH9 zWc7f|i$NEL;krZ|-@~2!QYw|eu0vv+N-h)odw40oLfqGbal>|kna%95n51p8N*eum z^PlBjCEn`cIdNA5x%V(m(C!5?B9?xQDCy;CMMq{$pmwbqTjF(UY*L>(t{1j`ZV%p| z&-#tC8YSN}1B?N=ZdP*_Wrw5Gehamd$$xYr!3|0EKD6VuIc$ zx0c_jkV}87>sxc$q9<~4N{8rO;?rL4GNs)uI#+Wazekt;@6IA$yH_9ceKW&glx#z` zf%bqt=m%%DN`7btnmT=$bPt|jd4#6%QA0OD{0yHi1sNV=N9G~ZM({rFjQc(yeLoQC zeGrGo$$=q$_)DHGw)OF3@d5q17QejDC{fUUs;jV{Dcw-=toTtMFE0A|EV8s;=!5y? z40(8WSx(^bzt+d{+^j~)&(8qU1i~n$wH`Zx1-}(T{qTVQj$DA`0Vhis=fT9^tH#O$ z{s-kdh7~NQ;3Wx+_57y@5Io?2CLq@W`AD+&6_R1M$@QwJ9NEqz0gjVvqMUloNjJLa3}jBI`j@TG6dgSYskjGLFrEEc-I*^awacs{`P&g`at z(~sBhVux2LKj!ynYGBwxsRSZMt)WZEsFef%aE5D?4L+M^EdFE3g%GpBvW?N;$)C0fUH>@& z;&wHz8;~jE$N!yIrf%#>9%mD#r&ZQ4 z7Z>M`;;8{MY+dG>M=98`&`2GHwJXm`i`?yPE}28J)QETA`F$<&V|oG*soQN7P( zg`ZR!!u3o;N;yUAWj?tD`Q(e~@V0~{P%1g4npf{(mSjqBl>2^)GSIy?K8p*|0aeYs zslt|tlr>VSF;zHRSY2vg(Q(Yr%D`3KAZtL1)u5R@(JSJ}o!E0#f6@Q4s<~EgiQz zCNP*r7LVM>J@ht7)=_cZ5YJqOWQ9G*yu^@hJ;spen?c%b3X|=245>xo!5a&M%z1~5 zESg+*5`7j8nwd^a?r)3GMhm{ll5|(}aBX+T4wqTKGc&?_$fah{pr+}049~qYUbOq9 zNP-_w&blBtq<)TeF+nh)tEH%6l{_S42#(x`Ny=vl9kW7N>*sgZqvH8t?pzBEE#(JK zb$^e%3p5A~nwl0oQWOk^KCal1`a{W3%$a^cmc>7z^ECTO{4k_KGzPf65V0(2VA_$Q z0I`a+!p;!?BfVM9kHz8u&$j-=n2MTb#AyLuo&8hQ*8MZ(m(=?^2odV+#Pz;s75npk zF0Kpk+*7a%=r;7o*f6dEGb{E3Jyp>CD@=t-i?7;8$FR-v7?y_JK?)?^Rnw&}H#bBH z@+=7(#*D1yJulKW^ISi633bS9V6GPcAX9*5bO;`f{;g6`5YocmiEW#Cffsv*6jAIM z#8L8^&;l*{qte(>?3TUq2S9sn}Z}Z3pB-;_|#$@>fx{jXT6oHgiWjb{8VI_$~3m z7GA{P7XRA<@6tOWdn>{(Op$vT=k?$o0pK+NByNGl~M6nj06>KRoT?sphF6(Lk5Z`R&zB=q8M64CA5#8;h z{aY8;|46~Z{aqzK?JWMky4>Y|CVEGB9{-=19^v@~pX&|qnm!~o(x8{cf2lXf`-+Lv zCV93g|7-CYS~h-TNGu*Klw$7T(6*7L?YgLjm=l|X63!@pJ2s7Q)pPbb+9nK{#x^kr z&VgM*h07zDS>6IJEkvmCk`bwyPlVsjDzK|z~svjeu z*fzyW;uGPDfy~t>iCt5?E*rOyVhtdCi31mqXupLp`)%U+DIiD{r)}pBlgBOwe-vjo zU5;FJF{vV| zfh&(j=Je#ND>yTPM-LL!;kwaSF87K%w)6CO_*jW?6-DBg+qplh7zC;SfQHx9$ON<^ z%D;#{Cv$*RmI==ouW;Z(kp#ldjypvJl<5~Ijv*_gLhK&nHBQ_fQUI{4ac79k0avwn zdJH)MHB?3J|AzgnYLR$rj8|siRuIwP!aX25d`8(Z4^BqJpkMwK zu~4jT;0{-d4pqkzaTiC5QPHv@G0|jlPo{?5b3K%%Ta|$)wo1vhF9hYUGkRmTq z(AJ5&G7>m%lQ?yf=XT>(jIv@hT!x`W*#Rh`NRvig5$)fCr%YvR#ku(yil%ytY9x*Z z5T<``lH2%J@x>%hPagq8NCfMp4^wWQ<)Jfn;41I3ZBZ&^RE@TNyHY7*_%r5Ah4nrj zVW)pWsgyIMN?Bl@ge~lun$auMlG~=-9inX-dS$1QmoxRLft|BU&gVM$F1-uy(jP;+ z;AI*$k@8vkSm}_)nl?f2w<5dv41I$1mv>60#C@CKH;L-#|k3*p9JE0RYF zcZ#F)ELnE?lO=#KDdbf(%)Lvza3*)9?N)MP0d2ZbdbXOKl5@m{Gl3lsATiW|wsyP~WZXd0 z@2c7HDv&H{?QX*N)H-khTHd1Yc#KbPRVcFkDjUG&Rg|gQl-Lq9pKi{j=}wAtWj>^2 zumZ&M^|zyORI+4}^+4As6SBx$SThhp4n}6SSbi4I2qM#BZ*y~~G!&r6h$-;|%R33l z7JH35%t*9Qn0@)W8BCB(@qKS>y}1fFT-C}N zR8m0F--m}l>C%S2bUllX0Z^8X#8&w(Al+w*6_~<0ftRHUQX6RS#%I__yq1X7=V6aW z&_D{Jx|7@HAE>INlyz?ME$49J7^9dj?p;2MMm*C`QB`JKQcSp^ngwpdpdXxiI ze!_?+#qjwTv`26Nnn_x-YP#^DycH-j9b&Iq6LpRJH-{} zb4OekFcfu*t|0OQdkpJdW_&nTD`C)`DfkD=#oWhkz=vK`(tN}r*~T&k#C<`Y9$cfZ zCL>Ct9zIW73s#V-sNOFNaKfiMyTiD%YhFh~Sg(elTv9B31BQUjG_Reqbp7pkZ?#o^ zO1XA1vuspcEoI&lb$-GnN?Ro@l?C#h^|F&h-}$`Mc``t0v#G{rqt*p;o+^hOJPo}% z1_^;21TkCQl6J!JPg5E*XgdM`(R_!gU>+v2^;m$;dA$24Z79X?eM6XoEipVdZ$+c@ z5l|)aLx?4uPB^w1E+my^Gpc6Ku|0x|JigKtO&rs)fjI1cG&rP-)Uf0UCDw!h3PpZ7 z(mknefy^2SeMyowFF8E%gAk7|omRZo2OP=VVAdUq(MYvIdNdNO&lDepxNFHSMT9Q7 zk}&ITfXbafePNQ4pydhm9Hr9C2oG~< zm1Zx{kuwo{+Sk_!`$1ltl~F%);LWdT+E1UM!_DvBWkpMiSXqNO@gOfTr*sJQwnX`B>@d+$FQ!@zxqGd({pPM>L^b zV>7jLh;uLGWhP&%yocbx2Xfj74igIWw5+S!#rqfXDhHOc?u|hF1aYrM=3gl)F5(Nl zSkSX-%$;ah+$DBg#EWd*z^5_<M7(n%sHKO=p z-f#j|?W_*mSglIqMayPZUQlMzZor;+Ge5Um6x8$wWK? zasa`7pHr0pq@M;C+{N6ksihCp zZp{xUL^eEi1>=FjkLuYb%NA^t(&3oDRa}06=jK~S0HPd^?$fa~s?mdm*^jI&E5_&A{Y-TZbY5D^TtH#r99V*#YhTb2G$QdX#&q}O3zY_;|zn7bnQny zVWyI?FyGh?60j^O!3owsGh;!r;vFJWfVLAsVx8REu(_06}LbZ#w9WU=B&?B>HSdMa;R_&KV)}Nt#YJLuLV};J1*MTOM za2{Gr4kjp}$I4|z=ZkX=!F>}Fw;tm8E3s;4d|NiG+h`841gzc&iL`EQShsi}M|p~n zDoC$nqF|7f9u&6AAS)M&rI+yMBujIjoYaMf>HvEbcIhDuu|t62Z$u zmvf)@8lzn#h;BXtn2Kw~)0cBUzfOE|Ic%4{!zQn$g881C#d37WkBYTd@G9>uL^rOq z+=@ol+u%u3A$!m5k}T&P270=RrQW0S+({HU=dt{6iMOucdH8UvLIKY&z9l4`QN$PzuHUC-XHR)_b2C`tBj?F(#H`J>GHU`z!bq6?{&=zU1s za3%Nn9*(Jp2GSdP9ud!jmZC>h2adT^LWi`@Ip9M-gt~Th82uWnv z@e|<|mPSbtC9nNbUrN>T>KbKXYQbNtSXjbysFR9!50h8a5fYS!+b+7RNGng~=4dY{ zW0)Mha#b#3$uC9^Kwfbm;_QDk_Hs2c5JNZCN#R5xEH4KQe^MlM}m(q1C;Y}ctn_mM< ze2e#S2$+d*XXDO}+1nPp^jI^LIr( zhSR*B953?PgX2RQ{qE>7G3!SG)zUb>1(<$A_UuzLIgZ#bU!(C7lBi(y@qF&;|-{&eE=@o*nI%+KN-?f>=id( z!;9kKuBBi`UYhvLH9U72oU;)G`x>!4hXXrD@a!XVWEjY3>r_vVCcs~73^W5iTaj}U z_bxEQQ_D(nM9&dk9HftxN|QYzVt56LUVT!AX@O!$YN6x>F-plIv*X1lMSDcE;xna@ z;lnR0hhM6O?_nI!2StG`;=-yb>OK1Alj#H?smkIxMyvn{@x!jB;x|gLLFUD`>-sA-G+Ulyn z)yPHTW87}aY!>%khjF%$56@NNl8#z=vN8tJ+DYFpRmUh}PIB5s!u9Y2bjVhv?v-;! z)!N&{Y^!E9%jy!_ujiS#cuSpGG`METvdr%l-?<)9nAPGp*K=no9I`P2kToFwOReC0 zMXR6{zE^oy1BY?AUuSW%tr-U?<9#E82h6<@Q#%_Hp9O#~Ryrr3mB=3(D|qCOy@s6P zIj2NbiMwy$&dO62<<`@rgh|PQLzcEf2VN|KIf++ANxZrPyXa-nA@Ru#++6|BtiFe) z;d!E&==s2S2=JlSvFXX(c=%NzYSkGNkh-~fJr1Gbyc>BMKV4jVBQJ>8 zKP8htDxSR&9NaEGxRF=zF_C@~&kE{})(968;OUebAvssz?KDn)SbU;+e`EzFuqSofouPqhS)|O@NClO zaiexu`MDS4I0Y{!ONM(>F0FMPAuu8dj?So+cJZv0W`)yJEgI%JWX#0I-tdy=EUObP z*Tt`DF)UXOQ-PF6RNvSjJy+`doQYVd7aYRseL3q@z)yQlH7h$Tl8*9Hyj-I^N%Zuq z>l*RNT4YTf0pSJLiov5izw$aId)oE--f#ozEcp5hzN1R>bd#>>ZdPKn_^5dJD6Z?> zBHlmBD^hPIk`1Lv_Q-8=(PiAOL?a?A);mC#I)uW+J^2>yZu{1(rk-!>!-po-m7ZFC zcg@CicLZ0~cf|K^;hDC3bRxg2h-|u7ymt$4Y`t$*7w-G#bRiYX1G9U0Q11bss(XmE zoiF=glqfHY_K4ouqpGva$7req_=s8^^Lj(nA zV~Kw>sKRo0yfkN#!qQcG!trN>a`g)$#2^{QdwC8#L{xi4EtP~<^-0FVoaVovYg6fK zV)Gq1e7-I&zk@q`Z_t#(&$F1khT8|HhmgwuSHP9NDV_jW!CMhZ)nK)^6)DztR0Vc{ zqQ8lRJ9%OGyD>`Py;vTwg!lEHaO%(fyEx@eo)i3lNGIDGH{#77@~fEZBf>goEB$yj z5uYd`v`^J2?f;<2vA#wXTWtSSY{BBh@rXF`FI{>38+1s6l`Sy;2P3WhuP}d$FRuJ- zb|?SSwfpB0OuGI41zOd7DNg?uueN_RtCjC-Dej)&H%ho|%%noih8bYvrdgYX$pkHp zwCs7NST$pvubP6zHuJ1T<~S3?XhEa}iBYKrcna>|)#!bq?c0#ycoFzEo&~U&4Aa|e zMZ3}jaqYKxNiZ?eT%X${q6GU{@~qyhDG>ykO{X?>c4NEV*fFcI*-50jOfqy%20bR* z>IOoMRAoI|=@BdM;vGS+=>lf)nT%KY(oD+aPe*HOhACo{W~y>6%Op()XSONIbkJ>i zOO8qRg*kFfy3G(#xQGm?rtW-G#GY*)%^Am2`TJ#pT7fCXqLNXklq1X`$1YeZ?FIt=*)KH66MntW?vPxXM&|S#Mv*T8b-covP5&^~iVm&Dw&6 za3td{in#X?UL;H_d1`|EfP|l}sMH@8^B?8K9j(SeI>K?S4Todc2i6tRCnZhRcICnG zb?A;F`f`VVD>*rIm#uH5IQLQRO*BLh%7CV8Dl-@kk{G+-+>Sn&s{8CN#H^HQ9KP`R1P?B&7}8A7 z#6XfMbbP`(O2+ny1CQ|nzFvIiG44s&p!+5eKinui05vBnuN_?$mhlhxyop0*_`DH$ ziVB($W?Ud-p3`KGx1DK-MG=YGCJNBN;2V+^wM;{xiJYJmYtpZ2(TL5PfzrK&NQH@u zkMU3hY)v;k-Ns6`ic7!8iz(0~1qNXzaxTN4ZbT5YZS>4i&m-UGk8@LjD}4VI`4w&h zKRkT&l&E~&0Ivh6;#XgL{f)oA`PSR-{O#TM-v9dtAAW?3X&>`eeE&>A6KZDmf+(*K zE%b+jRb5x-IG~t2ZB`GexHu#H{#AuRdzSLL;59aS+X~+kWAtPoS@kGd*Vi%7N@bDz zZn0ggSJb-mW_6(tB7at~qPBpjEmYK&;te}}DC>1{i)J;_$t?l7MfB7FvzICQ@RnJG z70j~a9E;ikT}rHv}#qBR3pV-Kcrjm1sh7y!KWz} z<7%Q)B#N9A3N(QvO(FikT80{hnSBLcIg561x5Mz z5hA(CO90l~Pv7wh;B%PTQq_6GabnXGygqkXB#=w8+D0FEV+qR*iLYWcCy2+N;MHk} zZq1q_JR8{r?o>C6_$PT4Tmnm<mh7?2KoYLsLz!m_N5xZ zHq}-t4koTbAw9A{UpsPlil?6BuCgv5Br_dF-fk7*jKxJZa1VOI<6QhH3=%}tMZ1mi#8F@6LHkzhUM-_w+DijG!5kdkPfrKPL zfC~Zy!hk3O8{EbN2;&AAY>vS_#g2OiJ8=Qm*iPb}>bS&lk6U`2#Qwj1_PJ9e^4?o- zz4aDe9^HFS*{AKZ``)^FGg(tm)NGP}ehRC;Sr$JHHPL{a^RyAn*#bvnCeov;!h@Z-RSm{{jvfr0 zQlab;6Sm3cpEkx9Y{$gnwh2JBMJ{R4+G>9U&zCvR7@3LCYl(^r<)mkf(WJ4`vbW-p z-1Ll5RB_QMZhgX@~a) z!g@frrMLp^ot=4DZh8(LMDT;44zldmp%%r8j)8zKs^AT3-EmRfs4uFUctaH5OdkUB zo9B$=&@Jk&+O5*5wkh-@NEwE^P~jfyI4K)(r5(#A?U#V?fvr0=Z%`e2WXzQS#6T-1T_lX_JcGz+eG0* zvhkM)khpw-;6TA_Iv=Vqq-v5H(Z+)5$ z4G?O5-5^X*mChWBv-P-1GM|mx#Su(qe~#AZ`C&T;&UT&`5hn2kdFqQ$?Y>B7X3E5u zc=wPy1#QP6Q23!rqgzEoOxHC=82klqQYQtTAR=kxtJ3xowB)Z*o0-)r*8cz&AWZly z>2*~oECO1q7SjirVh7*k*39Z($tzznszSfkH}r2b(e_)62Ps^L8dfJ$14CIH+vY-? zpypYr)D(^PHWhzI?Yd#bXA4T^LYOS+J=Hq4(jRy$6~8aIVR`D$fT~|xnvfyS{+Z#N z^C3@x1+}`LTp#IWsS|;ZX?Wzj!`10KM&w2@DKUz&kg^Qf1&}`zj&>|yxU2m7WlVC5XW=}U$_5YjKl}mh`@ij z%h>NU#&1!AxJdx~o$UXG;SULt#gYA9Y*7&~wVWd6EiA@;2}+C+TNaH%1E(dG0sHXp z)NLY4kb4{^1ll*@bU^gPE@FjAEECLh8hV!y9smunn^o!LHc|4jF~&?bWY^2a=uirm zPft}+{s>*3l!j-O@ET5c5eKL+xEw{XI^FoJXgqHQzIRtF4sVT#qvhd7GrUkrSxtg{ zhoHwtR=7|P`$?3KXLw#>e6s+5Z}Zu(kYg3@OvJ z%w4aYg~x?!f(8mESrbv!U&npct3FGG3ko$wsp0!%eD|ChH%7ujW2W#J>t8pJ_mKr) zMbl*W>qcQN6lp_{oNzR-csDqMs==|hQQr5u;meshtSBAJCiFSFS-$r=yxC{TzP0JHJB;$( zY%&$)EI7?zMklIthqroTwqqA}RJcGs_J%RSyD)BU6iu;+2AN4}HpTib)?;6yUe8^s z2XMLu9C|cmC;~Macv%LVIrt4C}V)sUJk{* z^7xxZQR*tpsADx`&rneX`sCMdV%65@$Fuoyt$tibkI4VDo~pn>fhO4xU76xd^iE=v zZ{J2Zr05DjZ5De2YCP^A;FiY5wG_~5wP;JHDXdT0H6@BUhvz8iTsIICm882(i*(PdN$+6C+b}9!*in>8bE6z#Oqdu5ety4HjProMKJ+|A_kL zB&{3>?Q-D_4Ji#1jbfNvk5R$vD)Xjr4f#yyW?vv|(4MF{WYp{WoCpu+VK=P`atGC)aNfz@WZQ)OE$7g(d+77MM&(qktGrL|{`+~e zrapk}2Mt5tPT?LBNQtqwgAqIs5Qb0->R`m9j`68;ug^LY}4$y>=KW%w;I7 zgus^!gL71#O!$K_auh^uvF#y9D{QM53kT$FszLaY5T-3FlwE%S6JI26e%r`A1DprR z(P99BYnqCU2tk^vSIYJLWlDa9f>;EycT-7);S$1v*-;E;?6*L<{OS(~vN~Gzln!@0 z$k7zBiExuyW7xmBYOQHEvny$;{2@|bL6k=JR<0_LgLJa11zb7e0EFbQxuvy9Wjlg& zjiH2ejYb!MTn+aKpafpCpllFM2-(Tu(U@m`w)_&<#P9jU|d(odp^W@gor=3q)6_y)*N>l3G511lh9?`Zu#n! zFqBu~lk7eoc1f-9LC_z!G!!>7nFM%h-_(hcwQ|8nKql+tc^?@??)7SV5NKA|`_XvW z26@j%MrpxDCD>t#8zUg8@CL|*H?f7}sLk@PAAyY@khvclS*x}%I}0ZfEoOmb56^bS zxz=nWgR06D?%Zb0w{JV9k|o$v!q#-cZaumio0MZvcy76ckYV7GANgQVt5fu z3j5w`W?v#N|HQ~j-V<4O|E2Q&PjDg-CZ7&)$>s9pPcVsBs1spB=U2+~PmSymd*f%H zQ~|=Z&zgOaytx52G#<=`*%(=^Y4D<696}3(=`mx24xf`)AmK*GI;21C1lA$PdY0 z>^4#g4B@&dI+B~!NIHfkXmKOr36I3mHY3srpD@HaVI*p;w(HgisE*qhBG|lt^%+8D zLT(q^Kj*EZX#46gYaw3oU2@W&jH1xp@r9dP5rk8a5xgo4k)4|2`!uG}+1wGBO1<|y zU;#`ttxD(129d~=_1&S(-%B5nU;N1^nf7QrTyRR8+t4vb zxPBa+Mu_#a_&FYnBb3f#a^4rvgFeopDCBLikU9dQ(16m&6ds3@;x|y|C-}AdshIK5 z2j|m~(I6O#y2T<3@N9H6h>Jpdr6Mwz=T&8pCdUeiTh=OS2^ND+wd)SAA@MT&nZpZ@|_ z>{t5rule<;-^hRC_0g}4KxUm?{5etV$S?O6iT6|2?=EooQ$)oaDCwJ8D?u9K;0W=J z$4D1H%*9^y72mfeA(tO{TTt#Rc^h$tL40c;v{*l!)$LAkroiC6a~Inm~e{t zy-Uo=&q_rLMSbh@C&YEs*wRMDZbY%eF0nS>3H{{ztNU&&@FdBeB=aUjH=lRZX|AxR zmtJVljnTDDQ6dd{WY0TJFFA#2o(i|WHguHpy~sfV)`>(1@R#h_(xYs7z%(f)8cY&d z2>ZbyDFUjmrGMjAnoQ6nB4co9Jv+E3QE`dPPB%xFf^)KL7*&=xuuRJS8+?*_-ym{e z*eK5kC1$p=MI%Xwg##=S_3Zo3rr89Mo>fP;B#W;Tqx5< zl0xFx{s^Tkt4*Hjn(-4rqGo`2J4O)L5~hzxK! ziX)BAz`c4Xbt2_{{#aBtwM+yaAV+>*S_(KFs!>!{h?ftkm!9;8F;_%1hE+Qv`>687 z&rC}J;}b3Yh$@|${HT6O!3Tb<-Yv8LgxIaeNU)^N_2ZERe1aFS;7KEP$>E!iLGZp) zfdVp)bEDDS>N;U9ipY9O1@xWde}?BUQk6(@k@4)Xs?X`FI1$eSuH6WeBMlix#l-H zzmxw3%@TUcK)mG6{n4Q3jWY{{7Z#4uHxyI?@7|7mN6{Sc?wz=I-7Q^(!uM|MyY>de z*hRtjVqX%0Qz$%tz`K?N58|mwBBKpfdX021Yolo4YR5MS|M4*}U#4c7 z{`wBK=<;_)t@a2FvPd?o>wj70A;;JmnPyJ*LN-eT@+8TE#Y=+oTx80z*HH$u5#93M zOtZjPEMLhqy~Yxm7BmB%8j-ftv^df6)i9PmojzoZI0J8WYb2*&O889JwlPYE{lYyk zdzL*Ai*zqzW67d%2);YSJkqh84JutLbQxHCt{hUPxOdp-np$S;80bBkW!9f!G|NdN z%-m4+IXZKoPRV;oWz+l}NY>d@B}Shc|EaQb5Ff)O$4{xM-r2bw>fiM`OSu@cZAj5Z zT{N+(x(byNd5u_q`|N*u>?uZTid!KB@n%-(DW8G z%@Emxx`+Cra(2tHg=TirB}}ko?vb|?nt>#pjV$Lfd7{wt&6r6EZF4WTXsyP! z)|oTf+K}vofSHLo5soXk0soaEHa^6aRH8~$@0I^9G^-Hgx1z|*J6dd}naC*f_0cl( zmh@Bo(CyNF9OFd+J&FgKUQiYY1vm)0ll=dM_jkhz$`2-*(`_T(0mnJH&dke&LRTUE zDp3KQE=5g=wpuGMtTVG*e;@^?vgUhVS@VrmzLRXxgun&)AAnMZVP3Re&CV5lJ)5Th z0@(c2d?-JwGpouFNbzn5ntm5xAzWIgxAVjCYiyB zqoHpe*s?tazS^DZ!Kxuy^6EAHlqVSm30pR-#UXP3g%TMMkyiRw`OisaiSaj?H`&Y@ zO}VayPMz*}nn?bK9_ECdqT-+O?8#<%Q^~)`I4Hgfre(*##&xh!LCPXB#&SV>&GRG1 z{QG2+_|9ZAm`rMHHHo77ztVQ9S(WlF+OAfqBqn?(WW%XuZD0))*Ao%bC2p8lhP|hn z6F0=nT}8~_qpKm1G8A>Ydj(R%Z$+q6H4jj~_D@+nCa$P(m>@$ycY71?3lplCuOiu| z#P7RDSBFKGU5=Py1}Q`!DIO?q0!;&y^`#CuZwd(JB)YG`Wj72~;aY-k#DBiyEQ0N_Q1-%%P zp$V;M-EpIE6ChJ=-x{Pm-?EuD3+84u9KO9Crq!ZlYlXwhG`Z79G%lT2FBIi$Tww+E z9Vbd%0St@OGxe~F9rhj2W+5d!g}Oe!!TC7+M!9Mx1{LTa~8l;;ke1$}J& z-aOrT-NZpr481#c`)>Ipj=VXtKwdS&^vJWPnckEUnmVqVC~^zs<<`8rqaWS=C@> zEUW!rJ9FHSotZKoqhO(ESY$xEKV)l8Jn7b~Q?Q31%GWSM?SB%OCo{}`7y&4rFFFep z+;YmWeMjS*s=2{wn8_LnPAI(7hixs9+yJnPX^Vg@^UoMo04-%VqJ`Q+a>QEP!xS=c zI0%j=URFr@v0r>Cv#b@Z5s>yjIKw1q|8HlQ+3wS{N^B1EE0bEKtI@1C=JMBh`fD41 z&2N|IG@5yEyS=8-ELhQjGoXFNJ2ktb4FNJ17)pl>_Noyl#=)G+tbx^WbxGM9{_fzX(RE$$X=Ob|+K$ zL;YrrbYR8SA(6OWqyR8>A3JVvPLfuQ!Wuc$WR-~ z5oa0RieRnPICvWnimauA1_~DXRuALRLvRAu@RY%1f1*_f$`FbOMaAnP#p`LYCQ*JR z@0h^klS1J=6%x_t2Ct+c1*ghQZKiKomGD6&sJ1I6g0{6v8J6C_ol-n7}{ z$VKj|7V<5QNU6dbDdrWXA$(5Hx~;vUcxJSm%)il@8KO)zJgFpg?mq_+vDxi#I=?oY;FAV)-0Vj!ouWM*)(`mE|BF)(sV$Gb3BC_pnW=7nsW8{VE*a~$E zl#C>?AG1_eH=7mS)6tirdSG}h>@e{c{xjvKX498_mR@&8Oi1WPkt&y=Kz5J3r5O^@ z{feN3Z!Q#uA_yfR9pjN?$-QeeF)oCSn#HNBZf2Fbw|={wCVtKJ&lAykGSHer`|F5|}ZZ8{6HHcrpq zF4v!C=7r7!`03{lse1vV$kYoNMQ)^ofGW*4fngmPtOQN~-LxTAW2RpmQylNX(ki%z zRKT3=K&PcUsZ;5k1Ey#f{b`}J_C}FD7&Bs$?CxgU*Yr!`-`n?~p}?iq)JAp)olMtd zm|SL=GOn;#rjcqWqo7~J2*Dn56hwK)95an#UlA4uE`x$mPiCb^bBn+% z0}U!OH=o)1uuzTzsn=6RXxf#u%N;l9TMUXtWfd2_#gcF0NeWRp*Ufs1A&kN;Y}Jg{ zSR9qHJMevrCDWti6XN>;myCPq{UJ}8e#yZJZ{<0Ic?cAaYzz4#)*abz$K@+h*j0em zp*-R%kbRfDe6E>w8r%cu6#L*EfK4@X%>cqit>|l_$f?3fjsYsSsuO+z6p(e2$b^P* zcVp+I@I08ITg8#&HuC}b@*&<%2!i%4)< z*UK7a&@iu{b~-eJ3L!})~!V94P0;z8}k!EJL2^pc7l*0@rK$jd{ADcQPsm8i*q z!m!J%%7<)%uU4k5t!qG~!_3Pw4lOWqsvwvUxdj&2%>~tPb!m}I0t&@}*NgljL$)q3 zb00G8Tl#EoFCE%{z?vWRy!lg40+Q6GyfFGB}COIL!P@3zWL=b(@9f5 z8Xtp@G@QJ3h#o|Kr98gE%#_m>nu*zCH9HD%gWCNNH;C*S%qjfg-Io~NgsO4eQ90xY zk#$2yL5LDg+DCp}qUry8n0m9 zbZo`pGp=JW<~I!gN+(16)fdb_3V;Pb2s_yi#nH%(X3R9`I*TFmTunGh;NjqAoYJgq z#%XIM&%%49b%Ka+Hl0D0&0X971DB8#PPElMykBPZ%3!ydk_d4EQZLA! z(@mcZxfVEdn8OZvg2-&cKJ7OBqua4P=w^XO#eABWj>tZ=L!2O-T@Z6XM28qn3*;@` zrf0GiA$TA{7(!!syLrRLamtHn`vG$z>i-hX;*fbdE8dmGc!ULqHTD@ON{l)#q%+aA z`z!**A^xZZGc!~M-EC{xRyu9vH}hGSCYSwiYvvWKBM4Xlw!u*z6zy+ ztLY5W=CbZI@VWCk+l8YK!yyl{HEM%|Mdn%(S5B3$FE%rR>-5%LuXj&BFGz5M{C2UK znY2+qZj$*+%uM&@`0bm690gY;WQBrTEcq9t8tZy{H&zn9YU~v5t+8VV@tbiDmKt>4UU5joqGplWx+%5!@9SM*Xj@)07dG~wDF8MWg)Dh4a>^MNCU z^8#968fV}_`PCBBKjNZzbm|CEagf^=Lz)FcmtdHRd7D8lrbEvgi+M9(3j?&cdme&+ zlPzO~2<%eRvwJzAPIyDiL0r&Y1S1>d>B-zJ!%NLTNGott_8?$eBz%U}*=Aj)j?PI? zoAYuU6?JLBHpaS^Qm@q4lDd%c_oDK-z2Ox-{ggY3e7mE&b3lyUhtJD*SlKn}s1VmEj$qas%%WG>R;#H}dB4+%)WrrQFO@uFAP?L47)0FnRwT3n}p)`BT47 zK>Yw8wfEc)@$9{ojvbwbh^TF{K+q&U3=}u&M<_)O0z=M1TN~{B?%=cFxRbYg;BI;U z8Kyr7p8)b}$JxvNKIz%~1=rNAa3)9n&L)_WIG-qXD$whx6{4rgyv>W;1Fxs@~`}dW@#waXlb} z3Vb5AW*?4O^^@|eGtH`z$JG`O3(pBmJoE)oIiqkrrDtfoD0)WDJ_}OJXXVMeDaOk5lH$a8VreYU{dolRQ3Pdkni=` zJelra3?0JD_+0sl%7CjMI+^|uIhlJs}=9`4KkVDyytPx<(AGq?I*ASGvXhQVWh!yi2VR(LX& zW^?@~LSq#CSHij@Kj~X8Jo-CXyTU9lMr1H`3gK#km|#p%A&xpU=CoTIb_u^}%J2%) zYbKadt}sW!BSfB9VP-cW_}8%FaMMNPBoAVMMeprC*h`7@ByCMXG&P+}L<1AWE>n(J zX%>2tErS&t2gCytqf$+|aHUz6gBW0R<76Q8S8RiwVx-%YhgX`VAw&QZxrq9uKC^KG z43H{kvXTH-R3SovG2y7V+KTNvDY$%C7YO6lbRaeu$;6WUCK(DsO@+Wb5%2_Yfq`lr+k<8EPVAKR#;p=J47(YlxOss0W%jbBB*lfq_*;?bs@-wLJXwpC_YD&m5vdj$w8bBrm|FG1=R zUuAr?`3tDpSXFIALQa)Q)O9fAK!h-&CR_*-#_=G8qgIl zX+Rx;UTQ=Vq;X(wvE`xuqN`JXAW0w;VTgH05*J(qAP%7M67GCb%8}S5uO67 zcOK+!tJiE%I!56g!BU!$+?G2Vz0^=*(^~n{`G%`Vi;Xy|w(kgG= z=rC^mNrDlAbgbqO^C<}B35}JK1DDm8VJecVP>-(b8jxAlkQ1r+hE=Ns?DEvC#f&}~ zDyv8z&{B!?@o2jG5I46HBc5P^DjZN%k+pY5od~HN&q>Q;?Sk2cmojm;oo8#mU6#u~-pkYb3&3CB!s zEv-qn(lKK(BH7uSsTu;%jnmamN441+hKXQCN&2;2cuzaYl98H;=sc`^t2M3ts1BWz z>J;ziVf?g}i^wuu1&vB;r|>^2FH><{l}MS-;6QHJC7c};aD)1DL7k-9K#;=)q#vS2 zqFXp=AqLZj-JQOO;j*?pB~Kyq`J}~4y0#0t3avZxE)|hQxLi~8nWyV_G?|wHF*kIF zXEz}>*BQL`XEZ`)bY|plY?#!uqE8_Bmtpc8J=7&`lI3{FUqSGI4zHfDb6xM2vVpL? zwDOeH(v_$N$#rTkEjAqDRX3@tXg{mJ(e#+rLVh(ZVRU;RHK9(Xa}6!$#&sJ->e)O_ zK!i&x70M-I(Df6vN_4{c$+4cm*(e^;G$3e}R;*jenTlNJ>H$>=7c@!=FeuHoqg?uVmbjIAhUN)cC7SybXp{6oY8ELM zvKlH>R6GNGz(owII##SU#c)WUM0Wg+Fad^JaR)jYfVFRJwv<^7!CaWCvpLR1HFS?M_X>-B% ztd23V>wAEcm?K0X|30dd3B2u+Rq}(pB z3)DlcNWVicFngJf_1-B)M(6D^e(AeQ#7vediP^rJf+>0reP~WQHf@{vQEQJM7XU2< zC!*7~$LcCjTOjUrWux#{@OFrMkMypzr6G&2q{d=?h9 zh#^QyrM#MhFAwBqYyakqaRNpGI(gbPe$-E(v29-A zPUX*CQYY`3ViYx{0`0RkekIIqy}TX;R zs=p2(@Le#eO2bV-FPb_V2Wzm==ji!tmEq^j+%dQt=qoI?H>_J%xnSeYxgvcYzw2m% z+%cjje1HC)v z2v1k^-RuqPdw0$jISb_UpTgY(HZ(Nsj75SBJ@yl=)3~6cZJvPnfuektHw~14Jbh(CS-cT?I8TP7osOk+r*2}xFr-e9|CEZ%t2R>-F>)6 z8Oy_#mo5?}2-HPVxK;jR&^99Z9O{Q;B9t9At=H+3H>|g1*VU;TgAl(5HwN`=DKK#- zs5Ez8To-hk>FW(YwB9<3>{chU9%Ont|~b>%MA560Qy0V`1UKy`fMS0%_ptPzN4Y zhf+V_>JZtx<$qo@vqHEr2x%*0g6vDJODv|7uI1|hf-)$e;Y<*2Tp4NxaWpEiyks}8 z=puDz5W>c_vR7OpG7)@m0;5=6ltlQ5;)&Y>2?+?BuanojWM)h{z<4TV$PQcRa-b<#p5*G){XO+eq61Z!{)xrt+j8-om(F4b&A@Z(2c>9OB3AiT? zePi>6d^Zci75mktVQq5XEtot+%A_xq)=OnH;J}SQ_j($x1HFyfn&B_|L%yw(aV;o{ zv$jTL+(t{if*T=RBGPW>ySfF5ms@8E*BzipX-OMrQz|Zub9=aPq43_tO~WXPuusF5 z?!_YYZoGpkpt+MsLwF;rK013h3CFV<(&sd!&jV7=Pb18owXz}m3;5uAk(U57M_ITuS?v6|HHn^IFf^z| zSJ42?Vbr#OLkEJ$dX=Zp{TfPR3a!$@^}2>12l5RK7mN((K#sKk68#5NHZDDdRy8$) z+7mhNH}Zm)&D@UPGH@tDgLMCnH$Oju^bEema28D%H`v5^$xsgN1)0AG1i(GKtD%I} zEsS_ue)h6i(D+Vdg1ztZJjTwg`@Q&g!l}Ga6k>Uw$5Hx$ocD@Z!Vw0+JahXk{qqpp z!u}D4=>OQ7*FpXkrmG_BQ>;i8%)OBxSdFQ@XLHYba4{nInSA0EGn32?g!6M+H`=A{ zFQ}CsT^J*Ff5|7NWk3;8Kz?8GNXZ!DYt;4qIl5Oc7YtF#Ut&mevOu779r#;p+ZvEO zK=OBbua*-HSO9`kDgB3#1FxFJXa5s(0RAO@1Sk;r7rFtH6aPU3zxf~K9slOd5%>@4 zfv*`-51|XC@tWy#ehb76$CMyEJ_=q#+&yvVHRP?Q4xv_m)%2H}kf@#vAQ&$&XJKdU zOCV8R^_uB7PC)~{kjp``b){a%xdJj-rbs+sUMIu`p<4f?Y6JuoRtS ztKfqkP6<`GLA?svQlY43{CE*`%Tr%BGe>2hA{})|BJ3XOz{^tRct}K+PhR*sWO05L zO2>S~*$f1RL9b#b!(Ksnf|fpq>tGM1WMMXdzKSSAYci}9m|lQHCUz4HVGCQDKa2cAYAM#=8m}M#`P-|A}P@wj#o|+3Ky3V z{E&2vM0rLem{}?>T%+{-K$1}o2Nrb(M{B`4tP(`-7z4~$6qTUj)?TPe2NXJ~WZAfL ztf3-d?1P;$^pR0&$KosUs_~kc*XHIkhmbrXP=l{@>o$~G-hkw12q`FUE5|qn$T6O~ z%bsxPP0$+?4ba<%6vTD9Ks^^onS=%-TG7e;GW}FTk&OE^5s)#3*BUUkwYGM(wIg;o z?~S6GT9Gj=_UjBXAeheWAfcFQCxn~|9k?q=3ImBt+6=CsZ)BJ;Fr_q8g9hUTqKng; z4Uq60t(B^|XK^(PKMKceU9m-1JWY>jjxnPX@*2M5TaCl1nhbT#B?pZa^1J^UGmka? z(j0F$^C!xCUrfj@gW{}Cqc3CxMl|(^lpGRUFh)vO;5(HJ?7btVF!Hx_W&Wv*rdY8@ z_VM!b-l@s8H1cEs!TuM2r6_1uRQ{I15LNKujAHB`;RsSiToLOAP z>V!mM?64(rTMmAHBD<^ve2#iEqa|FkOC>w54X*`<#U zxO#zn3<|3j_03q*uaZ}0v{^t}0VpV2xH?3!mgprNjPbQ4`pz}0SQ8HcXhpbp-9RrX zEJk&zYiSUFcl9FkA6v-Ej?YX_9t^L^`i4-xd*RS2SR}*!w&3h;rs+t02Jr-Ll_jWC zul(#Bi0?!jqv&+vonaEYS8b{4nn9#U3lC5_(4KH}vx4FbS^b2~D>L6Vz4hRN6!l*R zZE$7fx(ypPD$U9=kgGX8biZ*#h1N>Aq*u=BXlm+$6MU!0UM_p=a7voq<*=J$R?4^E zHY+N6u|ob;dIFVN+VY1;U(F-37A)8&_uZEe$VZl9-Mz4bKN2Zmix}=&L^EDTaQYft z>!XGGQ78kPk)kc5YXk;~s>Os|P~4KDKT9^tY44cDp#hSV5OL!~BqvRVpTlGVtg@Ng z+(wh9Eh{f02~g5@RRVFY&*LJ&^Qj1_U=9p{A;KkD`y}haSY}bSeU+3v)()OYAc$|= z2IBBPWUoyGe8iU_3?tc>zJ!0JbI_89RPL6I@0t~6-6e9601&Rj5e?qcBtgH+kp0abs>6@qkVT@4*w2Smn|!kR)|Hx(|$@0uSR{eubZ<5gR2 z8xXf;|Djo@e0S@I=B-(f+cRcc(hjRAC_u*o>0puyt7O*|2_xoKGY-;UT{XB9_})$f z24*KiRnG-P%(8mnoIsX6gnW}GDntcl3|Lrgi+C;<7hdsiqU&zx36y01&fN(3&3y!+O@31$z%ndk|1&*RxgXiS<$ zFfwiIEa-tLncDvP189wu`9S}Qc$fl4r2}K>@7)15*xkiNBQpSb%XRw`vP&20B_a40 z(PVWKc|fg3i!L_gmA51W#^F9#LQ_pbgNY(zDK9&f<2iJnF{G2MGgTxOpBt9+XYse9 zG5{7>rsA&nGGJF`b;V6&E$13=@JU{wYfzw;l~ln$4d!FCXY8wutA(r2pzJX#abSa2ui#2xtfG57A3xQ7>KrvE$QYE6e6%8nA z6`2IAlgIVYys|bzxE{rcLm0sQics<$RxS84-^tbVM*`}uC{TA3Q1_sLlK|zpHx{VT z)dbdk8m#+u2Z%%Pz%a0uxE_prwm*a(oDWA(!%=mLVTy5#iI~76MhAK3g9h71j&Wp} zxedw&7$~U~X$iNtlLC8HV^^!l`tiZ4i!;s9Kam&MZRO@;#=-gLWS-`DT+>B5vQO%h z2DwWCx2xbY$GIbzB}JOQoY8CQQwC+^*iTOous&@ZO|-pa3n&3vIt1AYzrb6ILT_b` zm0vq;0hoAcibzP1TaO~L@DG+6= zlU+QsPPm9Jqm{;1smIMiv>BDw{Sa+N=LDX0mdPk}smQ7{O{l4&7>J_NteUjo(;y2{ zcBa_-(|KH679TS}xv@VPcLlCCO1t6K#U+Y257PLpjJ z&HB$7kx2oKm#+Izvr;XJX7j9&5Ic61bMz=d$7#b@>Rs8Kra_`jE21aF1@cbaNwvZa zx-NPr(Ya{H1iI&w)QH~ewMheAM}6r>4=A`CHT`qc5Xo)U)uk5!uD1&h9ZMW*ERt2n z63ZupT%*g!0f#vv%@B+e+lxGx(wC|WePPqQt}AGLD2tXViEsy0GH|B+BE{x6&XQkc z*s@9-%Xol}9$joX7jv!9birPcw^Dv}JR!#{>XoS{5`s>;-A?Z>6eCv2D^qRR`SiDY zwdmuGd4RWadY{spw9MRlEbK>kp=19|vt5w$plM!W9Idq7J~nYg1BsgC#cw5FS6$l zeII~YG1y8Zn!Gsk6fg3lDbm7$1yeJlwGPlv^BnF4;V~#2AjQ?^4xW*WPWl{6z&Wru zs>A{=k+zUZDEdv!{388XJ2yHP^OOc=3eOVJXTht_zGLYz=)VHS(Pg$jBxkrlhfbZ@ zG-JUmme3b$lGWeX^1SxV*hnb@S_@j%g?ny`qGVGLLzD@hdQpC^OfF6wmAox757p<% zcXlLH<)5#Q4Exa#qIZF`RHwXN1TK=B@=o!~oiCahruSm${*TQQ0->mpK*~<8Ttq?b z(s$7VPUG^%u8vk%G7s`uh*HV+-GJ12NrW7RT9)QYCHZk)MvFn@odeXPnnE3oCU9kB z3h89@C24GzwO4T|M2K3Eex2aqYUQT$ditht`VA6`H$T63 zJ@zrKBDMUuht!C1_lT^Ah#ruk%u{^j591cY&|OFIN;6pc?r}e2ASPmCC9La^F|T2! z{Q41Ra8cf4(YGp;*lwQr_8wS1ixgZoG*ybj&ww#3p`_?CIG)tdz#3Lf^a;Lwa-Nch zH`%gXPg}K{o8^eDPEUs8SzX~dUEz5I3i#;gW}9J#_%>|p7hVX$D8cHI_E{U|ZU7j- zasFg(3M8a{N&71UVlhUN`lZN#bc_Z7tVefiKlGmvm67(}3+b2=<3w8!2v4HW794nH zrbI8%0*@inpS0z{DOOfJY0EWzhHQJ%Hm1?zH*~{Q{rY5i0@kbkD(h9I^{UY-| zg<0}vYaO|A|5n>Za3~Xxo@09@xy4_~n?Fu2B!Xr7AjZ9}oF)7t`8dSA7xq!$x=Nlk zYo)o??kH;y&T8(ql*r??5_tl+EO=M3!kGNwBTtqRxsEri z8|Ob>i9Crv1ScycatQY|=}Hk&m7V-ja9Ps}RwCo7Ru8O1#yzdevJx40H9eCO8T7XL z8=BkpmTt;R5B#kQ^NUm)V{!p%xxO?rE&CRr@_|ZZYTixT-DQNQJYE*Po^U>nq7hbv-Bwpnls*r*UA{BLFYwNW_8Rm&G$r$}h0Y?oq0ywuz+NldVICO85hLkLlLTuGhLyBdq zo0*08ZwlVsElWwOl6E4PT$f>2VJ;Hsf^+7uDL&v zgli5c3tamaz>~L?G?_~wRUzb=bgus9*v1ezwkw63aGfVeB!eGNMaGN z8UchQ>SKuOXI~6W!<%O28Dxs23hdAY5c!(urc{Kyre)*3jr*=VY=z)f;_%enqWm%n zdpBjq*hRvJ@NAbIr^t3wswae3Y*@Ep^MJ_PBOCVEa`PcXQFSQ(LTr3(r-& zvQ{&sQapf~r3dAAdu%14tFdhcHt&W|5z$t|Q%((U3!fSuUyWc^u50vKVBrs`Qo=9w ztC~SnK-5B%#c{ZnH{#5eg%c~QhFd_ zJvYQu<5#X5BNd^%2E|AlUR6Qo=*e?SOcj3RgsVIJSICU)2dwYU{Go<=+~9_lE2pgQ zfqxN{Zo+-5I9#P?wY_0h6A;5~0M7d(vJ8lw)y2YbJ2kaU6yG6NTxKf@-5HAjL^`zC zaroix*w4fO+=F&K_j0M2Q|`NuEjQ+FfQXdBwL@tkJoj_$m~!?9sQ!ce9;dp(+60b= z^fpCwZQ7<8M@8)r1gXRfeihu(0d37d$d-=HqmNM!$(MgbYYgh7hdc5dGqM6%nsW*a>6+;4IF z)1E#6>X`3dJf*RF?6~mA%{~3Ad&5;@rdHS1j}jyQEZ;{riGM-Ed4HAZ z`)s*x=)HyO@6-u&Rf|Q{KjhSXwz0-PW&b`~rTbspyLH(Yek1SRXB%PsN4~tzmYMip z)UEnfevS&x@36Yaaa9QS`qKTjf)NHteIHcO8h1b;1hT5NtwY!o@TJ;j$S=^6+_T@7 z>bAoT5Op1iENHEE$lLbYs*;nmEDRzEr@Y~yt#GoUwR^&|*lHV8ws32rnov5UEz&r< zK}OSVimXs&x}1KMZA`bD9pbqGcZOyWG^rt+UWfpdsR1RpBN?9^DrVt_MwwbuyDfs6 zTu>;hTf0US1r>M`ph~7wpuvMKS-7D@rdPmI3?33 z$xtfC3}7_%S;4QO^E-y#Y7IpMzRIy`6lYY$jiP$!C~8pGSxfo>1vV5EYLdqj*b`0) zHq;dg>^f0Y$9teY4#r6Y4fGaqlWaeg-a=0iKhslrrlG8enQ5pj;%B-6b$v5PD5~3x zU;*eX6rBWLce-EFn+$LciU_(wy@#7Sy-%5CC^~h5sKTvW7>WsG9r4eTuUu{OjYAf_9o0J~g%QtxbB~I?lhSUK@9F3Tqli2^9;DN| zym7<&NbZ4q4pH-VjN_-pB5eVlCg6#ZJAv|A zh{rnpxELMGfv=(ym~Yn*~<)d&CgT!yfU*bDycf22-{kB4;=r%4bii`x(Y(j<5yuf_} zRfR56T}^LLXl2Z+s^iFZ_MoLjrB7Ie)40T0m`4lkFl5RR=%M3xQ!L2G{Rk)$u z(9bH+vdCB)dBL%iMaDYo4Pp#eAGZPe_0c!g$L%l`?vK2vM!UkXfje#7hzW${%mAr9 z3UM3@r9;|k@;Bl2xbSk7Xr(+nks`!myKLr4r2}%Yw3Q(ERY(FyZDxA$cP*Z_%Nf_=={))0!?v6>HAfC4;-krLxIiAf);2x=!jpD&k?tx)T_NM; z#WM4-tZ>qG`?@dPBS#*wEh&VTd(42q z0VuSCF~RMfpeenaJ8Hf{zIepeWFQC5b+#$SUOA6`_Q@-*vrRSj%a^XRO*5{NuIp{} zrySrZl|9$nd~(_K5M&*cA$&l>hexlsO++NBudlaFhIDJp4Yo;;ZuQ-OO4sU26*t=Q z25)w3^!3f5Hvb5Oq~Ej{k|0`()8AsCU1d zO+OFF_4M-1VmwtXMFQcEI z$b0GMG5H4lJTCu5KTpWK@8jo5*@&Mkh}?K0$BmEuCrVDpFnxcDzmKbn`&Tb=pO#O4 z-FW6&_pqL)#(4EO|qQe~7YgsvkM> zHrqju`?uT;oz|+FDvalM(srAz_*mkPRF#jo%Ew&g_1kUzX33xEp~wXBg9CU z0|k8r4T)Q-8do*GYJw>Fl3VzSf4)|AosK^*9->4^wf$mY?Ke^=V16?7kawmLf02TSPOxfqv5X zCtd!Yp4|MCA#?A+lZSu2TmfczRK(8}0{oN76@vVe#TByoCxUJ^1YE49cTurGV z6ruG~ekb0GW1cKAVwj0@HxhrvixIUPB)E%xQ3koQs2FiKzhE)qCHjHIh>-o$rGm07 zM!b}tNsJi0j0Js{D?uN^_bL3CbR`S=MEzcwd%{+ixKCUsM(meMPuL1VkY^0^t`P+g zVi2iQR1L%5p5^O$E5hyYEFl9d+#g7Ka*)20!Vt-$+K_=mq(js}8l_on{A`DOLj*~( zLB+^pTD{+?^uHnY^Qs*s`t96jN&>N7+eL~ZHMsBOOq0J(40O;jm?z^zMt9$QVHA@GR#Owipy(A|kGq^F(O&BX%V zT(RJ3=pX=zojfJ~fCWF7Bu^MM)w@JG1R${m9T0SohR+UJhalmGlEpo&IY;CTJ8sAQ znRiUd8$+WZ)cAiYZ-m6dk~fmL!vS%JQa3`@LEFhgf(+URq@8rr^xBMe~FY!iXA0(#Lq4*ddb;{x_5q1m{OJ+u7B*t-=O#`Zwi0&w?z3AVN(R zoLfi);eiN(Ac<)u2>AnX6tR8IZClu+@<7nWi79LU9ooo5I6$)cp%V$z)CG*t)vyR& zzQ5=r8TfsA5EpN>E1;z%0toXykz z$KfR)vrr8}R1s-#v2GBuiXjc!KZf0+;}hPV{!i7CpD8?$R}7gMl3rLl?Q;w~0NDi< z(Zg=$g;aL@v0W%}hT82AXAonQ_ZO0QhyF_Y6B2L8Ebtb7&3|Vc>G+41c>gmh@rL9= zu~gr1k(7UHiMQJ5|DlGk(ILQ4;8YDFbS5EAk?}3PibIv(SzCXknrGnTHQ4i+C*g#iZgTBz?d#8^sYMbCXJ_%S1s5*%RkYPcF625ZI0~ zo(?;-al$hSr-b}2V3CJt5L73l9Fiv;lY`&nR>-$r1m!hGH5N*))Q#1^GJY)W;VL%l zuzFT=GkToJtmZi#`aY#b9edc>*TK%d7Ojy%4OlnFI9^r9cm~lo5eGF2ozkg_khd-t zKz?bj2OLO)t7fYR9Yz9HdnW5O+ko+LVdtqdfPrv1f?u4ZhI?8}4Vn?>bgR6*0cs}^ zoWbKN8m4T6Ztwp>*=C;!Ad}%3p;V)g4ftGVYlXM(ds8h)C&DBF4_y zGjLy}EYJ^&pnR!bD5w0~R+YF2HFLY=XRp|DLW_q?ihT(_I+t>n-AXY>TikU9i*}KF z$$4f3va|G#sTIk~c(0J8(%yq6pr9kY1TX;_Aq5>yb;?To!neGL2!iBZ>H~sus*6g4--;%`>g{vR0)g~0q z4eTe>C|n!yl9Ydli?L|}H&;Z9w3)|+5(6kf`WuX83jj!0cFr^wWp*t_o+FRH>@1sg zE?3}}WZ;aMg2?1NjhD{nvz&SXonO$;5KfMrVN>OkPPgWH@$50r(A+EG$Sa3th97xhlJ;{_`*;r`7hVg zHEwV{**1WjJf~MAUlFZszY;+B_F9{&C0spz7t4A5`>DD3E3QVV;9?;{Cn=y_r?#(D ziC`f0K8OY#SFzma|3CArOV}iJ(cmQOeqAnj0mq6!O$sh6>rQI5_(@{%!n_j{n z@#n1DW&f+--tLflUbW?VbkbSpUD`@VACl~9Xq*>F6d%0ypb&p#--uVv#&ID9Tvf5O`EVR@0?Y%K!jg$vO>bt>5{ zHx+KVO3~LjdvSxvI)Ho+Tb-E@thhh0`T9jN7KAO4>x3JN!gqx>Y9x&)8FNR%e)n0~ z60tUXuUp3YcC3;}#k$ZQ=u;UPBM}{75)Cdv~Yd-sZc!d=u zmuNaGG$S;sv{wo`G{+&&jbGk-wOKnD7 z?*O+NYlV`$HKx6DXkugA8$*$$(BQec!EL(1T3jLY3L$IG*RL?DqrbHIr#|T4f7n=n z6vZG8H*Z1$8x=!a5xm9NJ|K9rO03gk6=_?yvbnh#0s#<8IA!%y5fO>D%6gh#usG!z{lMasXCq}idH%bTtPV0{ z?{B%265UJ3+|CXW01v6QZ|z{++KMXupQw0ChNjs^%ZsMj3*?nQN^}K$@5F;hkc;Yf z<)5b6tJb_X3=|bV-uK6$bs9TF`Ukql>Oqwd#`EE@%8rlqy$QBZu{)pY`|mT^o@V#i zx7CpX`=;skOydi=ufbmE9Dsd41t|1?Dc!dx`f|SFQCniP%8qSqbJ&eL_-A?J3TNij zzc8D3%3q1i6Ul!g`wm`C@83nFUeo5ydz8`BKlBa$Pb^Bwzl6N<_QWFN8|u8={I`(5 z$D@3^!JfDn>>!Cw#&&dfbt6R+lCiqM84^;!t4gJ6^?VyU;s&*H-{IPWC$6pEuTQQnVv zKyjBl?UdNE2p>-+Gnd%GED8tsLmHopwBbZBBjf~B;ncJm0QpS_<%3P85MZ!U8HM=M z2!T>^wMa2Si0N?d$#=^MjrP2>45hCJa{vc0k?Elz&c0e?rvjouTd^}NJkXF^*E23D zILinJl;uPR_yY$woaYNd!=eycRBmAp0{o&Z`PHLIg(0ZNV?T?GTt>s#PMrfWKS5HTDr`-c_ivDuz~sXD@W*bXX$IV$8l0D1VANobFHx zH0Bg8Mzxm#%{lcKb;q$oYc4WIQ43KI7}(%LGfrpL4&}JWfX_8+91=N2@uH9c)Wa3L1~rRW5W z$}=$-lKGwX%#g*?M9Hp9@HEQrqqu6^uCDH`FcCzQArowlHAL_?!o7U^j^4jqZY$pzXY}5#i{m!b_L8_Js^@VMG@kJAc?Sp0TNkYd1TvGyT9H=Y!26k zEk65(0YAs)AqU^Xd)T6HlR;B2KiXyYB;v;W{LoUnN2ZiGK0kW8eg7#YLhs!2J2(>1 zm@q+rNHq`o25^Z~K%zu4iYj&kmIzr(6rmNc4SOYy{&j!>Q}+j8S>AsEHk9K+P2^pq z1y3O+w$d*)R2Z3%^5-J*E{uW{FB@cE+78~9aIas`g)OyH?^}e%-o?!&4XWlKb=%GD zc`q?k>3wutg0N|7YZb0Nbc7H@3iU44U|hyvxG(48)uFw*M9LLLYqO$ziQv1EfWiEN z-pkm_z_7D_B?)@>X?PY2$9~=JReE>_7@X{bMx?xoZOBg)DnJD>&$vd@kD-Wdv-=Pq z_$UD>8CgUK$ZO*Z(5633kibs*NVKRTMz4!2S|if0j}{<9Y0nM1Kns(r#2naf#Cj#) z#OJh#jG}MmLb1fB=a$Gj6390!=w^q-!1ty5#YF$DtL!g^M9LgfQ5qC=QFvQ9c4|yu z3`o zL>UCF^SUZKtyJ&d6eZY1w_Q}^kMS3Y_kYyCr6A8I+iMbg(;rR}Yx48y?VPiF3+w^; zY)#_S^v!N@c78U!-MhTBz!f;=sZAX1PC}%Hv8rj=USS_6LnH0!2lrlInx2&|mb5p+ zM7WpOoa#OD@#9Ia%FEoR%#{!P${dkUSX=^B_upGLBpRjO0;aMd(bCRgI}q(T@=irm z4iw5wS&4q5=wQ$Bpd7#1F~dPu7sA(!l15&le{?y}AgCM1XidFU05|%^5FKp^yR{=! zb|s_7)(5afE2c^DUsobrY1hE;NzL@=He@ z6SK~G^3GD^tacr7P1f?dL2~zG(Oo4HYP5AQ%{fI=zf+m|O`S$%tRzy9DO+y%4XPa2 z>KTB@*(eGvFR+=q0UeMq*h~#5M>;v>zQpnjiakj5j5XYx7UjKI>^M!+-*a>Wtqg&4 zE;T?rP~JTD{wi#{=7g&tdpd8}z!Vjj#kV)@Di{~z&{Li-%6 zfDC(XU7lzQkrH09GVcGM*iF$&o~*>BUXH%ye|OoO#{YZf(-Y5p&a!wpDZ}Sm~?Enm@B2M1L=G4qB_)bm9`Q9JWS4%sf1^+2rir++6P`Z97MgaVe zNMSG(e6XAf{7;VdB~J6&vRcFu+4GLmdm6$SoFGAaicERV3Fmd1_u;3J}IH*O6rkrOd7$e;Uic*Yy^Egg3L8M zf>04nWgiS#o4OXaH(?NG>p`s3gIGUoy86+Xe*@Z~;2Fiu4Ldu>G>!$;1xkM-hN8nV zY$A|0TcxVT?Iez1ny?SxeexERqno2Xu})N+gSp5}H%B#|i@{S)d2q1goNM1kO>7@N zs`G}8>U_N}7pNsKy^zO{anaC%u8{7cLF8O4mxdCvmxiOWk1U@@gl{MCJbd7=fn#>r zuAwbC2E`Guaw22*(D`v(!oXzjk*|glvl1^wqq&#KuS1DBh{Ab9fHi?WLb(lRT`BV} zP7EgPIHIn$Yj9JPjS=~W zSf3$9}94t;5k9NfskHw1dvaBISCb7rui>h=h)8|t^*`y7_r{+t$$S$uU7e1%^fGoNL7H!iOYpW4 z$mq$dfDry&y|A6S2>Rmp@Ly|T?_*&VyX4IqUFGo)pz%=?%G%8nsvzY_-iLoak&pB| zKGyU2#5Rvl^*r|IK@r>LGd+*blk@n(HjgjGB{PNRE22kqp;0i+Nf*(nFZo815JG_p z@UIH9qn&MSP?WYFNCr3xFU@Z?jrfka$%^mgrJJy%A9x|Q8}mO*3nD+-uQg;=!fEM1 zGJBZlsEf`2Q+iMD&l;0s6dMy)*Zhvg*o+yT%`|vz?sQ0n9+;P3wb{(8L%d8-)l6!TdMjk5_kp;UN6V32r@8WqeHwUfdcy)g zfcLF8^A-mPc5rXlq4X}0&?-ds=Nah?Oaw4I`EYwtcw!b9d^Z&GUX>R~-?L_!yV!y_ zu*K!dR>%&53{5{>Go#LN-v)6xPlU05W1h@b3v4+ z+;&43p^R>faht$stz5kVDWZi^9uK{Q;>=a#Dz&kifT*~fn8U5xUoSq$1En#}AcT%e zTU-D?S)J1Z0^^N9t%N}FYCTV=Wv{_J;VG*$s7Qo;9e(CtFJtGrB5ea;X(7}Q9$YZ` zA*l8G#W#vXfQrT@B`ruUDg1YaZfk+C=HY+H50(rHk&2kvO^(M{a5Dw@3sVd(D2Ua8 zq!?Vc%G^s_;Q$oGIJhu3xSij1xK0Mnb9n|KjntiT$|bH5{<|zmA#17y^317W?oJ)1 zXq(cj2XgO8XA7;u;5Q{y#2pmBX5!RQ_?135}k`LFYoBm*6Qo+Y#31A>#F6 zKi1kjcUG(uVwH!nYu@d8{&0kOM8Buiq{bopCEi&I_rZlip{F*0Crn&u0=9$B7`6d)y{Ed}DbuT269dDEahjf>eBVsC4IOsg}Tsm7RXj^<`SpBIs;F(&sm_X^UjfaQp-VHu?a-^(&;+~>IV1*#Yr!kIGt%yiL{JbG@J1(6 zq-w=L;A7@O(ZVtwZYK(>40up@^0T0Cp)o7yT#TmJbip`++OC3Kj0i#2Nqn73mWqU9 zc-O>)55i8KhMDX8@zfh<&nAqYKYm8|PD za;MBr4g+|exe2KvgrSPHp0A~fhp5b8Daq~&4wYvub>zDb<0ch{%UhN@$}=JJq*GTV z!V4TSc8?Ko1do*8E_DPPT@Jasd2o1tl6lgJ!1j{JGXRk%ZvcVE4#Zgc8G`habkB6% zsP$2zy2#NCWGJMd3J4gzr33_G&@>=rJq~&G(MF!U`51@kh6q$ymv;;dxE%HRG~rBs z3Br(6g0p)1D?V5iY3k{Jv3fdogG;HWGxMSFC7uL425*+;F$%s99nO^d9P{= zF*T&VA^>4;+IBl3>lKmX<$`6%sCNQ)o3b`J#yaYD;@;i^F7bh5}?hT`lV61n*NXm{bfU$vL)Nj-WC#ey5JV!?F)Gu649poO0kwTM<^PqGVQ5x~!qs;arcTv&BO))}(k z_U@-;rss&pDe~rRuGpZQ{l$`jdt8HL@dLOjzmNw%0BPlya>WCPL-&=u>H*ij#=qoy z58xT|wE?wDY}KNrOW8lHu6km1thxa5{;A zTteHSrLz9-QPg`pU659{9}G(q8n=r6V_4xfEl5AA5*7JVLkj-a&=*Y0;2`(FY{-G{pT&eW5eDiU~k#a9rB_vK3iQF6X)ydb}NJ>U5U&UqC zkn?v-sju|o-hb#3$)3<&LnGddI^uh4ghyp3R(p9H#aay>QAZ7+{?!ef&;Sc>TnG4s z=Jr&rGVS9H%vx_$otucfzJUvKHo{}KBRX|y?_z|S6;S(99{0&2f3vJvV?@fef3F9* ztk>g%P8K~+Tv*(&#a)K%&Neu&6lW!IywyfWx> z854w8X>yh9!*dZEXn@PSm=dhx?IUl0)K%hx##U4Cg3HJTLoOfV2!((oilYRlNO%In zhwzn1dOyhsl5$ovn)+#jQpG2{FrM5 ze0*M%&y4nj9vz!4 z@@}G!ukcM90@TuzBz&_PD1M7Jz@*J3i%ys)+)kznYx~&1prNf(c<<2P9fFQK8J%2q>G4muEcbih_Xw~!W8&Nh2Pzzuhiw&{c>183v(Ae) zAKZr=v={24#*;Q0@v2LZbwFJ3sBekok6~&jx^Uwl88g52=_hr0mLob)FyzHu+a0UMiUnvNa zVB>~I(7DvJ5@PAdRjSl_8=cMNwW8o^Ir{-kScof_7)G{w|XD&fpud|gTv#rlnH z;O-Me$@Q}96<5Jf@G}EEeE#25^VaSYD7ERm|?~K^IiTctBVHMea&;A+}qC%7m<02UaV*TYiNZ zP1vT|CDW?fpzwax08Rni0OX$5I}UN< zACN0vbLB&WL0_|}yC)SwqbPhRwPwElWVo$N*p?G7QM_F>p@{J-ySr9*lcI+|U0t;( zek8S$LN4pdT2b<-u58s^Q9D1jUQMnJvwzI$OL22nE?=j|uB#VCPoz~@+ffJ0=O<;! z>#oR@r>rJeH_fS~_o(F>HnJW*ZPjAitlC%~4~?7nSvmW4SLuZ3tX6Hk@bK?uG#igI z^1M|6;ImeCAGLI?Ue@?JQSyR3=XF<6Y4J-|BaD&S2sr(+ya|oskyornWKF3NU_2s` zzG^SGaA|zAD0tnf0QS$or1)djL&@=mRYP)o#@hN?5qZ-pp1Tq;+8D*^>nIf(L`h@c zaD@uqwpvW>S+i=1K27yNk9Xt|Z@BWuziZWFAv3#HF4G^P9$JK*Ruy4a+f?46`bJUk zzPt%t3wGJ+@lfIV2_S19$X#!^BK5nidVua+daPc}gnCiF4|>y8IP6oap;})98ZToMn*b!;!$?~AnLP7NSN^=>&sAd#214Gj&PHb@ z0w2HFtI|Tpi9p9MZMB3O|>xvga+lY=4kvzU9iF{G$Tj(bL_%LXrN;NsXk*VSfE5RoS?t zd(kqDNqqcc)uP~M`Tkq3$iYzP&><$OLeniD8p}m(d;Apo|Rm$C)5C{=VD03gBgNK_o-8n@;7aS^3&u-Avc4; zEgRze-)z*P(!ljTUTi0!ZmhZglDxQ#+Xo$c&h+V+fe`WOqQ5dmTb+*j3swRn&d>P&8DmDt_4E!l7 zv>I+zxL1u_nnk>a6~%JXPADQuW4mot`BAyxeOJU7E7!j7DyAH4m30%74N3bU@@wQx z)TUNGfuW3X@-zBVC%wB|6=5V+tE_86kB07b%i*^I8Yf29%cfm;TTYP2?gB?OQJ%ib zHPo0SZ>3+8<#W4S1(T3ktrBr{kRN5%tq(4nEW4CLJ(JX6rV;WQC+}*CI z$2?HCohBdNjYciF3M0K5|vX57Awr)@^L<+(P|pMC4FiiU=aj?Xy~%Hd8r#a1Ybvu$onO z-8d0ATo*xtql)T8;0Rr0alFVTjsSQfc%&|;+!^WynJD6BmtNaKtPPLg#M%~dd2lg0 zp&T}AP235Yal3UHSaUTdBveP~BHjXA5l34Eh!}xzIj7MIhSnfFvnX7WsA`ZSK5_Yw zLwV9Cu4>~Lc?|toCNKTORcG|bm+`0g*koe_`I*jeI8+|e`ILR?%J(nVO(+zFTGx0v z<5SnDIAYz2&~dslvFIAmRvp+bvWhDcL`kitT9mC$E5|!A)~;Bhp%h?R3|W)jVBUO1 zl!x-n%8o~Ui6v7Ynig$s?o=$7YEdJ~PmsYquCl_lHb7Hn#18CG3#bvJ*BP?rId^dD zivu3nyT_I3I8hZ8%ZvB8vWos<>jud19&1#%gPZ##`N1An$i0a+9N{ZZrk~};DfA~S z^FMQC8gc&rzV!c7`Tq+(b7dje9<|AXt6?>>e+X4(LRLq(U$Q}7@|mmH4JjS{3~iFz zKXU~S-%L^bDgK3}3{k_@BKo#fL5h%bXfAakyd_acZj@@m^&)b*RSFpNB^0tx6rnR@ z&F8LQ&Y3)783cNL!{^PH?|$wo7=1Pu7M^4EodmY8#!rO9U%PGYXKnT-lx`rw~~1w_bvacd>x?NS`J(y+i@U^LrJ{0j6&|FQ$`xO@BFH3U>Og=wmt(cFIufVx3Z8-Q zN_=-H4X3Id1;cZdy#EVVe&N-+I6AFuMw6-=iolSF`&e|1{N@YLo@=G|OFZVT<901g ziclfM)b(5d5~Da1xbzKh$&$tnRRXco-*ib6m*6|zpi5?fYPHN$-*LPM+^9>Tfl}uP z4(@-qfX!^8qIll~5&VZPi?wTH$EUtYm$kIw6R7z^%y6?V1OlOyNh4VMTXZpOZW6^% z?%&GAjd~@(fc)FIXhy7~Q<=(dZXi5_G8d9GwT-hHc^{xlyMqYiom@<$Lal&E#a$Y2 z{)rC)4}gKMTupT>I_gIRno^0YHcp<^JQ%PEWW3ILGclquMt_sH=qQ81@ zS+-!w6*(OhKNk%G`Zb-ATc9FLaiwE8e3=WDVlD=sZ-g`!TLbSrXcapHXyW8 z)5y`&@EJC+$n$`>Z^8@X10_bR5ygHQMP4<2a3nKeNs%F7k=ttqS7kz68D<$?VV=Bw z+~81{T$y~@bMuf{XgI1?6y{T1K@-dmSPD(Wi0T5910~QTd22D(;lw7K<}LS4lv(oD zaH%Y-9UPiJgj>TN0HBl=GOP`hDK`ubEOD-K+|=S+7#3*JZ4&&jL|Fnn*f@ZXkJt-5 zEDIF)Dh(d9hwr9xe#58tj!EorCLA`cMPpX1>D zY=zMKIHy4Bn+0FZ#FR5*$+ZLSdLecJ0#In2Rxv2TvuS$ihnHee zsMSEIIhW^eLw0gKn`c}On|VE~jz$c_it6!$^JgE153J0~A@lJbj`3Jql68btK7Ok3 zE}(MdCY^PpQt-nZeH`q@yD(?ZLY9_8gR_VXt3VU<9EJCC zmf=TXv3Lcd>g8RD-%D3lkx>xCTIOs546ef%o2_wVTs_0D%L;z-s zcF53R1+Hf?KiCw@G6=$IrF>V(J@S#bP;Bs!_=#AR_b=2_X=9xy0bu^gG%|P55TdQ!YgdcR zQ!ui!6R#DXxaBQpp2{D`*@wQq_2^sM&z69PA?+&s!Bv-9k+;!Wa1v;LxTsW1^}+{F3uFc5F1;8Hn5Vkbi%cLNQzzUY z%qnl27XA>P;ftctWq`*N&IC>oE(4*UrMi-|R6PGCfG0en4UXgH0U{Cn zOyH7&55EFMj+&&5n#s;;bl*L+rf3t=U>sJf@tr|Y8UqueWBaPQ9n1+vbhXtRMt$GDy152rYXa)bYR$$4^ zgb7nvwSsNQ5hw|aTEe}AQ}npFq824Laz^emxuql{2Kh}Zs2#Z*2vJYuUWCH8k z4oDVub^sFWV0kyjAvmfHQk-Og097k8VGhfn@a%vcteO?fUWNBbz#7+2-dPmPM&TNv zln<7!JR`QKAwySniA@sbvmA;GjulWUKW~Maf_{}Gg~AI1SKYEa`$b@Ob-#*A2+s1Q zgn{$ROt`|Y$g7(Nheo~1X?bw>Ae<0Hz2rBhV%%u#HD6}}9(h9yOdb4F92ckmMY=d? zzT`-+yyIW8?nUwP2p+(MzX=Q+2EG~ zZ>F{YFy~vCSLP0Cs9DOlxsCnW4ZM>mvsg;!yXcpV}66SWO?^*%?^CaH+aQ&^1u6=Dds3gjV@NGW>Ox7>NwJ2%;Li(%jIZ@>NkG9}MD^{5Ew@GO1 z`Q3mGjA97?&@J()gyS^fF%q`44sAG?!GPpdmmb^ILs0reR#1Z(zRz%x8%i6*8`etYJ5^Sz%aV5M8iQ zlUih0hd~BWIq%0HPlS?ShCU$z2vZDoUg5>KN9Ohzfw+2M`CxvLLI6KckTvrQrbZ?V zlL;p>VTi%UqfbB=1`{a7A;S)X$SmBP6wjLVt(ew4PZ=!LimdNMLt~Tr0Y``L#ljiY zQ;|qn*=!=Qi1~v=g45pdY8^1FL2wq(7bF|gjHTs6?8IdwvT@6(^^&!`7;&$PH4wYc zYDq;YcM%eC`Cr*<2;4Ag2y}Xl zhQNg)bK@C-V&@xxQS+vrA}6t&yJ2n@oP~~BE{9JwOX5THK?d0<1Lk|n^%;XjR0aJP z#GW4bm1w4Ig@)33A4azE{QMW*;Ti_UAA!o?NQPmj9cGn^ZX&{?7^qb@8-X$Csv1qz z>x6R*^^el&qgO_fO8duB0Fre!lQB;zDA$XT20`_$@~LB;KnDGmQ#;Yj;AcH z6q0l~Ct#HDL^kj5>a*rTY5csCG>rp?GFkVp6*>DP`r{ELvi2iWbw#4V>rY9n-nW0E z87$F8Gz(8GF~i>c?PSbYa zEey$dkmKTkX=daAApcU~K}c#vj)YmIsnIAFJ$kU+Q;dG=aV4BJuPE(u8W$jJY zrkDqE>xt8NUBEO|B_|wdj&!wP5|M-Cx1K@aQ1)~X02R!OMsdzSRq0H5{*gF~t(qRS z>1Bekn1yO2d*_45`YUA2Zs*}g00N1ULLGXibb}~G_fzTKSs)sjW0CvhXMn~_44sRC z=*cs2Q)A=kJ{j#Y^WyU`qJO>>nF1qhYU~&-!iQi8Sk>a83t6=?D1}pM=Apb=T8Z~C z4GhJH(;c!%ZJGB76cgnDfmr~b-hv|uQSqHOC$J4F=ann*it0kk6>(UIPJ|SEAw#y| z9n#37rk_wGbFnopzDYNuP3BQn8B%&3%{ylMw1Fj51e;UqYXbq6@-`-lVDx@WKCJ=- z7^WlUGP+Qf3TF>q;1$Qp!xoz5$Mj+=K}postyYwM8=|Cc)nO*;Q6A#WWoPMMf@x8D;L2&c=0Gs!VYvjri4!ppcL*&I5*IAH|kJN z(`ky9O|KW;FdD88J~4F8tf>S~+Z%G|bXjw(8FZbYrXWvw#u1LgEk>`Ptrem!8pR4S zb&g_D&Sr`mImZFx6>H_^DC%7a$!6xcn5}yESBtFkH1)59XfyMCsvyxODlV}0g=Cvs zu^#V*xIU`;S4;vqF#n36S!?mPA4`Cc(tDBB6Cy62p8b{NyafF{mk#urkkI&lHx}Y1 zAXgDBKlJ@!EL8c}wd+WZa4aM`tL?vY4E$WQWV!wsbZ~83FRU0eGWjzcOW;F7hGZIM zXpkzI22&rHS!lo!rz4JLx-i<(G;cE_XvF2Pl|!?r%Y%a*9K4Tgku1bDbs72B=(4a| zm$8k+7KZBaIII-+cs;0)Mw#1Skq!f+;uFn+_*fWCM#}uG~`LZl<)P!6drg9fkilp)iVV#L=%#y;{4%LSWl@$;~F7B%0>UF$QdVeOngQr-9R z_rI9q{68QfkOdmn%_8qd5^sj%|J|#H^CwiBKl8)E`3rvdf2BrX_$-7J{{LCsEdJO0 z4fg=08vUK+B;G%0-*JV|vy)!0hE@&?KNONIXad#rCyo(;LHdOcWM{MxekY3^lHY+6 znBwA)HMioW;)K>um~MW92R!W6QIYI!dRY}fYCaX}2WmbRO_C6*)@){B^h;3q3qD^Gib0?;4B z8rFpRk6vSDK09iKp!ZXE#zE0p?QJt>b&g&;5>HISLN=)W6tb1jSfz&LWda@F%53Fk z0+TH=RTxq(_c;Z8Z3Pbqrv*P$d}&LDqE7^%*;5}fxmgsNm60BaZ>V6?@7m^IJ6tR(}aI+IyRZ}Xcl;u z%?BvoAyjSK*+WrC`ASLqJ{OOid^X70o$H|Amf_zPxWq>Yk8}klOi; z(vpp4_<(*momyea8pmzyTC@m8nESQQ6#+@mXm!M-kS)0IUz9%KqKj47iEQ$5RbZg@ zD7{oZ5^x0Mts6~m=4CWHb*l}zTt2zcEN!|1B}B9)ZR%Yp&R7Yo4^O( zsN~!7icMy?%J~npC2!YMJi0l38b!CLwO3}|nq0f{HtKu3wWm6?1JYxDGHG^tMWA-*phVMZG@4fhZlltk(%)XB&zzZzApEfz)?|XntEn-yg zpz>voKg1{1^DupWbq{RU2j&q*gQ7>F98csRQBh+6Lj?{OHJI*fhTF-7ST3awSlMT8|K(cMZwc@#c5`K@EMv6zBc&3XL%Np=j7$5nRx}z!-Kn} zwV{t2${kzG zeT=tc@O1M?V~1RGx;e*qTRwj}3g40D8RiuE-07xI&N;&zZS0gA&M^0dCT9B?$bSC5 z{NxO?+}I_}GtDW%4+sIQS!~Z7Q!c7@%R|mIM;af>jc1y5#z*pA{0V$)Z@0d2^~#_geoWwt zeu?qFlob*`zLL|VS&TRUM@bmDNECUsL*2ZAYq$!Mc2>EK6v1n` z$gY`kUk7nqobws+Lo+bousyNQQ4hnv>4)KsiHBj}?+nW(;Bfwf-i0?Q$to@8=CsA! zk~&x6yVY7uoOFO#&26bIu$sUf+{U(wz@3RzSkf!^T}r0d2M;w~L-1}#%c`cOM=xD{ z0W(6?xV*RNhw>zmbB}%}51%v~gA`@l>$q5UJ#R*eJok~rQ=Q!VwZ!uQ23hu?eDPXy z2=W?#bFGQ(yxl}GqUSCGnDr%uQIg~2lwpjfT_<@n}8E@kGvosL`nQbtpa-qi)7~1 ze3=BUn9?hlMd(!mcVgc{4X>K?T9McOWCDPh^|~c309WIE0}zSsKr!;BL%ZU_KsNN2 zl89@F@va^PGIs|{J&2`Nx-;k77(Mb1$42SuOI?onE+#-$Q9JeD_w?WQ`LB1EUJY_k ze1QK#Sevo{?`{;52Da`%k@F!1`(|%kOfUDNw24GM<`^mIbIAI{w%DwJ0kbk>Ju$o` zIu0DvPo=W$Su=ma5FKPK)-f~M3DcZzh}_FKCK|nG%J&MZR)Mf;C6)5ZXF(W-$_Jk{ z^D>4Z{(y0F#t_$V)D@19zddUfWQ;`NZHt`w@hXhTj0K)Ah&?wN;ol&e369x&WPfz8 z;l`p1-YgvH?hJafs8Dw>Q>3_;&BrcXO@82KtB1!p9pbHy+i+m!t@mECW#D;py`0?Y z9%_6ik8E|1l{KyIfV`#^(cgZM+fk7DA1jZxDEg73o*^o^Ee~lFe0bWsS9C4yU9IIzfegn&_V?;u zOmS1zgUAkIqTqEx5~RbSKnbnGp$sNLk%~1fhM97|S?-~6w5Wik3;Lk^hV@( z9ZK4xH_DfZVUdDkv7UxM3zD)FNn0@6fdZx*9MA=p-Z_p0=ct3cQps=q zxsD}RVNcg0OT3orcWB04PbDv46*P1$TDE4zY1}h6=+I1@Y6siJ5ae*99n^=$Ht8v= zYHsuNB6CXA&-v;nOuGD~5TEvRP%J?UhlWrIY!o%Nc*^Lr5tn0@Yx!OUMVzP{Xm@+! zpV~;Dxre{L?=y!*=guNtG3RrTEj&>{TVW+5%r98umGdQEgeY!=g<#fKHiBdRi}Mwj zU-PXU{D#Rs+VXdWq#)!=gOK1gJ(EqyQJp`cV~QX zM&mRcVYD4&mhV~_Rkyj*E4aED9%8TOk>i;&F#uY6Qc)-P~Z86nxV zz+Ijn&Y0f4uD$!%t`#e~7k4h~QGPd7VpyKMYypUHL_SJ?^5tg>+!b)2%skRP#3+}b(*3=ff49qA7Blx2W?baWr5ikmwciJ6}n zn+I<-Vl2va?W`^+mO&?#5FM`D74~v0TnpDjmG*K45*CI-d483{WLcNH!ZAEU*1Vtb z+R_eq734z*K7~B=DcCFi;!j(n()=Z5;c(?vCrUSq&Wg3iW_Dn99>kv45A63@mK}sw zcNFcKy5Rt-e6!&R{(+3`GD0xgDBLZt`o<`jqXpw8BF~dZGW;=jBIk7Fq`g_)jA>%> zygl41>C4@xnn7T$p7@_{gF#4+vCUZQt|}TTR00J&rJ7n*l8#^Q9F!rZI>d+}Y85l%;;0MTQ@9H?&ddFXq)Ui%N^{w$AGU3`E|{1ozWI+ zQeJnEMc&J;3h#q6OlKE-RrdyTzXtSxq2sJk!f5TT6nxMsMCMs#qm2*ykTlMA=e0a+ zRgqLjwXYZEb_V9hGqz7<% z2y$WSkM|r%3YJa!e0;+`qa* zMyD*g$y1O8F|m5CKmi_^BU}IK&Km-`u<*?T_}YG+J4GvpNSHhb!jKAYEn64pg*2E| z5tjCAy>LP}EFy;+RTL5#l%cz8W%uH~g~*@R)-I63lutiAdWn<-jzqjAI8&-@Se!c& zF1;+`hnScMg_~V@H^PmCGQ{VQU|10n2!>HFA6(`c9uGkJo4P~74*@XEEs?@bWI+_1 zNL%NFJeaB#%M7n~FT}rU=aJ20MLIBScM!7R6maz9Td4ugBs&p5#KJa+sCPmxEc_4! z6R&{N*fFE6lQKF&E}V)ZNT4_sDJq>16pPBWvP`-w;_G-mNetPHta5%xi0N}C7Zv;q zMnw$#Ll~mnD*P*he?#L zcR><`-dh*+6;^KG6;zBDzKtyP$g~%7QqsM1WY2A${GpH>6K>m+O`gZ$x5i@g zi0ctW=gYs}<|%}WteR3HVWhbgiY-VIN-mVUZu1n!|7x!nP6(CZKERueq>xU?jfMYW zl9vCNqIE2K)yn)X{4&=gg1av+^|KC~PVc)SqddCv! zIi0)}jANXh)5V(=8k}0i={Zf>E4SXOYH@Jb19YfX^dX6-!sq3_7^YS+6_IoiNl>5`$S&6ZZ%`>cOGtQ5DLqRu zYls;vZ}BKXX^6lOwAFbU`CALK3} z;07mQx&9=i-o?>KW-Y~qPP8)jFncq61@mw|LlIoyas`sCM$H9uZovH<$sf!%bdp2r z(rp$phqQ<`VsZNIM;uZ&%|C@h!u3u#p9CwMN7Hv$V*50N2_m$V`=;PltF2hnXXlZ}TOmM>o&<#1NQlSS6+l+z|Vo8O^` zHwA%ABxmc8(Rpzndm3cs!a9ngfzIy`Uca`C!eI}(zX z&?;&aMZ>l(7*kj}+_D?iH4WhYVQ`O`L}2{gB8>|@e+;<2Mz@vV*51xvW%Z_uiL#pc zNAcJrbiqgwf^j%;R>&t-y|EegP3w?T0GT71dX3+-u6q?U-^-S+5M!cZ>u+O5)sNL* z%UrisH0Zm7F_Xzs9@hC{V`&O@8(Jg}G z(*P0+Ue6YFup6o0I2`KN;rk2Ugv4yrB>fW^91xhpdx-EP%4VV-2XSlF1Z*+`OEg3o z(o{0(g%jq!I!oSux(KEz@;KYj$vA`CkibZR1d@uCeS z?2J;>EH5n4_1$K|2%T6fvO8DC0eI@qX47o%9Q0Ox-ol*AP-mO-n2-eKC#X!LmMex1 zv5E-A6^Vkx=1^{5aG2l?SA@q-7b1s?t-Gqj@gsOY@ij@--U|y5vKCvw?o8ez^(KM9 zz}{R07ZQ@JO(8J;MQI2pvS4q{CxgPQb(75`cv%>n)9W(`V{@f+X37_*z>y*db94Ht zwpj=h_U0;6;4y?L%dE>HaR7mK;hw#^(d3Wi$(t}fU)&AkT&@>^&%1(P9f!j`qbWA8 zrEg|O{J`k+nI!5WJ9G6VX03!SrV(LNWAjAbszg)!)Pk#RO)0`Enr5%zGL@rRWS+pk z6s=pEq;*Vi*Co)WEsppDhs%`YX)e8N-qRJ%E1W(f0fK@mD8sz7Fjq2EJX;@=bI>LGToK)OQu3gkmz=3SXXhuTs#hrB z-=6S3+q$i5n)^y)tIsjB1fBwYBJUh4$%E|0hum}HTai0ESGX%n*$!Ap3ai4qJP zxD?2MlWG?cUCxXA6A{rB06=ID!#5=&f*?bbT`fPk#WQ3n1Q&^?lH$knuCv}@DI9s= zdbK<2le1MJ{z>=|{98I34y)}O^g{=m1jz;^r0l)blV>0s*q2DOg_v7u-yR<%a5H}Z z+YruM&^PZ^AZprvwspXAhMK43_I2J)%@Iv2y?N&h;lESw&-7?Z`K)LsiUN1-J>WlS zvUev$S=*ALtb16LbuV5bX`-zA(nVSKvncBU2A>pVJ;=|ql80E7^{~AjIVv%9_9M3M z0m~W``5)U$n)SHeTs&Q$*z4)~q(vv-?MmD6wDo9B{hrSl(-gYfb{nR0EX{gO!-q8M z`Muw;FC=Q6FJgd#my|SX_RILc`3fKWoL70XEos(k{2oo9u<*T}`f_!?f!?`q+Is=b zgKx>2J3N7*JJP?CO^W}vextsl-l+551)R{%^z%n=)c5rFM;^+JbZ$i8{dBOx+@%TE z2bu=%)~byU<<2`i1@k@vbpOW$$bR0PpU|M6{>h+$J=UOLkM(u(*96HPxF`_olx6_upRxzD^m7GGPb*O`XAr6E$m`dSLXxxx)D^=9Tx|pP%RN z_nJnv`2&Cd@PBLvnqiH?k^a$|i*WuIfJgl#gLiqV%6`WG!@s1BJ~P%aT{wTG@&6|m z+~o=-B|-?GkV=tewu|a4Iq#pI zv9M4{KUh(py!4-*F^A={p+QB>CdGmU5IKQv9Q!m7FF~nCLfYOT%=Qj>c@CvtIk!jO zKH56Oe4G)q;tBcuGP782U+;02JxQ@1RXoqL=z)Nje%4b4G*QaEzg`S|T7J6TQ)xVN zr*ZSCMm%}p3Ew}`P9?~+$OT!ZEliNHAc!(C&xzAaCzWV)8eR0?hB7ivOUn2`pHmmS z;RJs|A9sg7$#<%gydQ|O2!R}@?lYZakY}0@rSZ@wd0RSMdH8Biemw7fL+@J3c@2Xw zD*(LlGuxx>5JUw)os*NB*-lLSLz)ac%)6Yu-LP421RkM%X04EAaq*~;*p)M*)nM&l z1oW7Z`ptZg8@!j+GwBKa4WCSY!}wEsf5WG3-|+Bfpd)XcP8L_4vpZ5(7tvUjy1INj zuBp{I3xLVBh1?p!#A+sOJfXX9QCDx@npN_M`#eQ)gw&{!Bv)3o!dt9O4{@oNpl^1m zt*`J6A%jO->oVOM#}~#$!mQ9JtrO{F4|Ui#a~Ng8N!iSt8N(e)7Oad_5L$Qyerkn* z+HdUbNJrY>-Tne z>S1sleA_d@^)b}w`Jc#x-}Xd|Pmy!z*MWCD;cW-_T-zQ0_wWDh!2j*Q|9?Ahr_XVK G@&5oRlYs*O diff --git a/A2osX.S.QC.txt b/A2osX.S.QC.txt index 545a470f..e6fb4b37 100644 --- a/A2osX.S.QC.txt +++ b/A2osX.S.QC.txt @@ -4,26 +4,25 @@ DELETE A2OSX.SYSTEM PREFIX /A2OSX.SRC NEW INC 1 -AUTO 6 +AUTO 8 .LIST OFF *-------------------------------------- * ****** START OF MLI QUIT CODE ****** -* Load Address :$1000-$11FF -* setup $BE00 Global page : -* Copy from $1200 to $BE00 +* Load Address :$1000-$12FF *-------------------------------------- MLIOPEN00.PATH .EQ $200 MLIOPEN00.BUFF .EQ $0C00 1k Buffer for MLI open -MLIREAD00.ADDR .EQ $2000 for loading kernel.bin before moving to LC1 +MLIREAD00.ADDR .EQ $2000 for loading KERNEL *-------------------------------------- -A2osX.QC.B.Start .PH $1000 *-------------------------------------- +* Kernel Stage 1 +*-------------------------------------- A2osX.QC.Start .EQ * A2osX.QC cld jmp A2osX.QC.Start1 -A2osX.QC.Prefix .BS 32 +A2osX.QC.Prefix .BS 64 A2osX.QC.Start1 sei ldx #$FF @@ -47,7 +46,7 @@ A2osX.QC.Start1 sei lda #$8C Reset 80 col screen ($0C=FF=HOME) jsr $C300 - >LDAXI MSG.STAGE1 + >LDAXI MSG.INIT1 jsr A2osX.QC.PrintAX ldx #0 @@ -79,17 +78,16 @@ A2osX.QC.Start1 sei jsr A2osX.QC.KLoad bcs .9 - >LDYAI GO.Reset - >STYA POWERUP - bit RROMBNK1 - jsr SETPWRC +* >LDYAI GO.Reset +* >STYA POWERUP +* bit RROMBNK1 +* jsr SETPWRC - >LDAXI MSG.STAGE1OK + >LDAXI MSG.INIT1OK jsr A2osX.QC.PrintAX >DEBUGOA - - jmp (POWERUP) + jmp $2000 .9 >LDAXI MSG.KLOADING.KO jsr A2osX.QC.PrintAX @@ -130,36 +128,7 @@ A2osX.QC.KLoad ldx A2osX.QC.Prefix jsr MLI .DA #MLICLOSE .DA MLICLOSE00 - bcs .9 - - php - sei - sta SETALTZP - lda RRAMWRAMBNK1 - lda RRAMWRAMBNK1 - >LDYAI MLIREAD00.ADDR+$2F00 - >STYA TmpPtr1 - >LDYAI $D000+$2F00 - >STYA TmpPtr2 - ldx #$30 - ldy #$F9 do not trash NMI,BRK,IRQ Vectors - -.3 lda (TmpPtr1),y - sta (TmpPtr2),y - dey - cpy #$FF - bne .3 - - dec TmpPtr1+1 - dec TmpPtr2+1 - dex - bne .3 - - lda RROMBNK1 - sta CLRALTZP - plp - clc .9 rts *-------------------------------------- A2osX.QC.PrintAX @@ -195,14 +164,14 @@ MLICLOSE00 .DA #1 *-------------------------------------- SYSKERNEL >PSTRING "SYS/KERNEL" *-------------------------------------- -MSG.STAGE1 >PSTRING "A2osX[Stage1]:Init" +MSG.INIT1 >PSTRING "A2osX[Stage1]:Init" MSG.SETPREFIXOK >PSTRING "Set Prefix OK" MSG.SETPREFIXKO >PSTRING "Insert Vol:" MSG.KLOADING >PSTRING "Loading Kernel..." MSG.KLOADING.KO >PSTRING "Error While Loading Kernel." -MSG.STAGE1OK >PSTRING "A2osX[Stage1]:Complete." +MSG.INIT1OK >PSTRING "A2osX[Stage1]:Complete." *-------------------------------------- - .BS $1200-* + .BS $1300-* .EP *-------------------------------------- MAN diff --git a/A2osX.S.txt b/A2osX.S.txt index 6f814e48..33650cec 100644 --- a/A2osX.S.txt +++ b/A2osX.S.txt @@ -4,7 +4,7 @@ DELETE A2OSX.SYSTEM PREFIX /A2OSX.SRC NEW INC 1 -AUTO 6 +AUTO 8 .LIST OFF .OP 65C02 .OR $2000 @@ -19,7 +19,6 @@ AUTO 6 TmpPtr1 .EQ $0 main & aux ZP TmpPtr2 .EQ $2 main & aux ZP *-------------------------------------- -A2osX.RelocAddr .EQ $1000 A2osX.KMLOAD .EQ $2000 A2osX.KMMAXLEN .EQ $4000 A2osX.OpenBuff1 .EQ $6000 1024 Buffer for MLIOPEN01 @@ -28,16 +27,13 @@ A2osX.ReadBuff .EQ $6800 512 Buffer for MLIREAD01 Boot.Prefix .EQ $6A00 MLI.MAXPATH KM.Filename .EQ $6A80 MLI.MAXPATH *-------------------------------------- -A2osX.Start .EQ * - .PH A2osX.RelocAddr -A2osX.Init0 - - ldx #$FF init 6502 stack to highest - txs +* Kernel Stage 0 +*-------------------------------------- + .PH $1000 - >LDYAI A2osX.Start +A2osX.Init0 >LDYAI $2000 >STYA TmpPtr1 - >LDYAI A2osX.RelocAddr + >LDYAI $1000 >STYA TmpPtr2 ldx #$10 reloc $2000-$2FFF to $1000-$1FFF @@ -55,9 +51,12 @@ A2osX.Init0 jmp A2osX.Init1 *-------------------------------------- -A2osX.Init1 bit RROMBNK1 +A2osX.Init1 ldx #$FF init 6502 stack to highest + txs + + bit RROMBNK1 jsr HOME - >LDAXI MSG.STAGE0 + >LDAXI MSG.INIT0 jsr PrintCStrAX >LDAXI MSG.SYSMEM @@ -72,10 +71,10 @@ A2osX.Init1 bit RROMBNK1 jsr PrintCStrAX bra * -.1 lda #$8C Reset 80 col screen ($0C=FF=HOME) +.1 lda #$8C Reset 80 col screen ($0C:HOME) jsr $C300 - >LDAXI MSG.STAGE0 + >LDAXI MSG.INIT0 jsr PrintCStrAX >LDAXI MSG.SYSMEM @@ -83,97 +82,22 @@ A2osX.Init1 bit RROMBNK1 >LDAXI MSG.SYSMEM.OK jsr PrintCStrAX -*-------------------------------------- -A2osX.SetHZ lda #6 - sta A2osX.HZ - pha push HZ - >LDAXI MSG.HZ - jsr PrintCStrAX -*-------------------------------------- + >LDAXI MSG.CPU jsr PrintCStrAX - jsr Init6502 Y = CPU type - tya - ora #$60 - sta A2osX.CPUTYPE + + sed Test 6502 BCD bug + lda #$99 + clc + adc #$01 + cld + bpl .2 if minus, BUG!, we have 6502 - lda MSG.CPUTYPEH,y - tax - lda MSG.CPUTYPEL,y - jsr PrintCStrAX - - lda A2osX.CPUTYPE - bne .1 >LDAXI MSG.CPU.KO jsr PrintCStrAX bra * -*-------------------------------------- -.1 lda MACHID - and #MACHID.TYPE - cmp #MACHID.TYPE.IIc - beq A2osX.Prefix - - >LDAXI MSG.CPU.SPEED - jsr PrintCStrAX - stz A2osX.RANDOM16 - stz A2osX.RANDOM16+1 - - php - sei - -.2 bit VBL - bpl .2 - -.21 bit VBL - bmi .21 - - ldx #0 Count LO - lda #0 Count HI - -.3 ldy #3 (2) - -.4 nop (2) - dey (2) - bne .4 (2*) - - inc A2osX.RANDOM16 (6) - bne .5 (2*) - - inc A2osX.RANDOM16+1 (6) - bit VBL (4) - bpl .3 (2*) - bmi .6 - -.5 nop (2) - nop (2) - nop (2) - bit VBL (4) - bpl .3 (2*) - -.6 plp - - stz A2osX.CPUSPEED - -.7 sec - lda A2osX.RANDOM16 - sbc #100 - tax - lda A2osX.RANDOM16+1 - sbc /100 - bcc .8 - - stx A2osX.RANDOM16 - sta A2osX.RANDOM16+1 - inc A2osX.CPUSPEED - bra .7 - -.8 lda A2osX.RANDOM16 - sta A2osX.CPUSPEED+1 - pha push CPU speed LO - lda A2osX.CPUSPEED - pha push CPU speed HI - >LDAXI MSG.CPU.SPEEDOK +.2 >LDAXI MSG.CPU.OK jsr PrintCStrAX *-------------------------------------- A2osX.Prefix >LDAXI MSG.BOOTPREFIX @@ -204,103 +128,44 @@ A2osX.RamDrv >LDAXI MSG.RAMDRV bne .1 >LDAXI MSG.RAMDRV.KO0 jsr PrintCStrAX - bra A2osX.Z80 + bra A2osX.SetupQC .1 >LDAXI MSG.RAMDRV.KO1 jsr PrintCStrAX - bra A2osX.Z80 + bra A2osX.SetupQC .2 >LDAXI MSG.RAMDRV.OK jsr PrintCStrAX *-------------------------------------- -A2osX.Z80 >LDAXI MSG.Z80 - jsr PrintCStrAX - jsr InitZ80 - bcs .1 - pha Push Z80Slot - - >LDAXI MSG.Z80.OK - jsr PrintCStrAX - bra A2osX.SetupQC - -.1 >LDAXI MSG.Z80.KO - jsr PrintCStrAX -*-------------------------------------- A2osX.SetupQC lda RRAMWRAMBNK2 lda RRAMWRAMBNK2 ldx #0 + .1 lda A2osX.QC.B.Start,x sta $D100,x lda A2osX.QC.B.Start+$100,x sta $D200,x + lda A2osX.QC.B.Start+$200,x + sta $D300,x inx bne .1 - ldx #$C0 -.2 lda A2osX.GP.B.start-1,x - sta $D300-1,x - dex - bne .2 - - ldx #$20 -.3 lda $BEE0-1,x - sta $D3E0-1,x - dex - bne .3 - lda RROMBNK1 *-------------------------------------- A2osX.EnumKM >LDAXI MSG.KMENUM jsr PrintCStrAX jsr EnumKM *-------------------------------------- -A2osX.MLIQuit >LDAXI MSG.STAGE0OK +A2osX.MLIQuit >LDAXI MSG.INIT0OK jsr PrintCStrAX >DEBUGOA - jsr MLI .DA #MLIQUIT .DA MLIQUIT01 bra * *-------------------------------------- -* Out: -* Y = 0, 6502 -* Y = 1, 65C02 -* Y = 2, R65C02 -* Y = 3, 65C816 -*-------------------------------------- -Init6502 ldy #0 Test 6502 BCD bug - sed - lda #$99 - clc - adc #$01 - cld - bmi .9 BUG!, we have 6502 - - ldy #3 test 65C816 TYX Instruction - ldx #0 - .OP 65816 - tyx TYX: if 65C816, x becomes non-zero - .OP 65C02 - bne .9 worked! 65C816 - - dey y=2 -> R65C02 - ldx $EA save zp $EA - stz $EA store 0 in $EA -* .OP 65R02 - .HS F7EA For compatibility with A2osX.ASM -* smb 7,$EA if not Rockwell, assemble as nop nop -* .OP 65C02 - asl $EA cs if Rockwell - stx $EA restore zp $EA - bcs .9 - - dey y=1 -> 65C02 - -.9 rts -*-------------------------------------- DisableRamDRV php sei lda DEVPTRS3D2 @@ -354,74 +219,167 @@ DisableRamDRV php lda #0 Not detected sec rts +EnumKM.EPB .EQ $0D +EnumKM.EL .EQ $27 *-------------------------------------- -InitZ80 ldx #Z80Code.Size -.1 lda Z80Code.Start-1,x - sta $1000-1,x 00000H for Z80 +EnumKM ldx #0 + ldy Boot.Prefix +.1 inx + lda SYS,x + sta Boot.Prefix+1,y + iny + cpx SYS + bne .1 + + sty Boot.Prefix + + jsr MLI + .DA #MLIOPEN + .DA MLIOPEN01 + bcs .99 + + lda MLIOPEN01+5 + sta MLIREAD01+1 + sta MLICLOSE01+1 + +.2 jsr MLI + .DA #MLIREAD + .DA MLIREAD01 + bcs .98 + + lda #EnumKM.EPB + sta EnumKM.EC + >LDYAI A2osX.ReadBuff+4 + >STYA EnumKM.BPTR + +.3 >LDYA EnumKM.BPTR + >STYA TmpPtr1 + lda (TmpPtr1) + and #$F0 Empty ? + beq .5 yes, skip + and #$C0 anything out of type 1,2 or 3 ? + bne .5 yes, skip + lda (TmpPtr1) + and #$0F + cmp KM.PREFIX at least enough chars for KM.*? + bcc .5 no, skip + ldy #$10 file type + lda (TmpPtr1),y + cmp #$06 'BIN'? + bne .5 skip + ldy KM.PREFIX +.4 lda (TmpPtr1),y + cmp KM.PREFIX,y + bne .5 + dey + bne .4 + + jsr LoadKM + +.5 lda EnumKM.BPTR + clc + adc #EnumKM.EL + sta EnumKM.BPTR + bcc .6 + inc EnumKM.BPTR+1 + +.6 dec EnumKM.EC + bne .3 + bra .2 + +.8 jsr MLI + .DA #MLICLOSE + .DA MLICLOSE01 + rts + +.98 cmp #MLI.ERR.EOF + beq .8 + pha + jsr .8 + pla +.99 sec + rts +*-------------------------------------- +EnumKM.EC .BS 1 +EnumKM.BPTR .BS 2 +*-------------------------------------- +LoadKM ldx Boot.Prefix +.1 lda Boot.Prefix,x + sta KM.Filename,x dex bne .1 - stz TmpPtr1 - lda #$C1 - sta TmpPtr1+1 - -.2 sta (TmpPtr1) - lda $100D - bmi .8 - inc TmpPtr1+1 - lda TmpPtr1+1 - cmp #$C8 - beq .9 - clc - adc #$20 - sta $100A - bra .2 - -.8 lda TmpPtr1+1 + ldx Boot.Prefix + lda (TmpPtr1) and #$0F - sta A2osX.Z80Slot + tay clc - rts + adc Boot.Prefix + sta KM.Filename + tax -.9 stz A2osX.Z80Slot +.2 lda (TmpPtr1),y + sta KM.Filename,x + dex + dey + bne .2 + + >LDAXI MSG.KMLOAD + jsr PrintCStrAX + >LDAXI KM.Filename + jsr PrintPStrAX + jsr CROUT + + jsr MLI + .DA #MLIOPEN + .DA MLIOPEN02 + bcs .99 + + lda MLIOPEN02+5 + sta MLIREAD02+1 + sta MLICLOSE02+1 + + jsr MLI + .DA #MLIREAD + .DA MLIREAD02 + bcs .98 + jsr .9 + + jsr A2osX.KMLOAD + jsr CROUT + +.98 pha + jsr .9 + pla sec rts + +.9 jsr MLI + .DA #MLICLOSE + .DA MLICLOSE02 +.99 rts *-------------------------------------- - .INB A2OSX.S.KM - .INB A2OSX.S.TOOLS + .INB X.PRINTF.S *-------------------------------------- -MSG.STAGE0 >CSTRING "A2osX[Stage0]:Init\n" +MSG.INIT0 >CSTRING "A2osX[Stage0]:Init\n" MSG.SYSMEM >CSTRING "Checking System Memory..." MSG.SYSMEM.OK >CSTRING "128k Detected.\n" MSG.SYSMEM.KO >CSTRING "A2osX Requires At Least 128k Memory.\n" -MSG.HZ >CSTRING "Kernel SYS Timer Setup For %d0 hz.\n" + MSG.CPU >CSTRING "Checking CPU..." +MSG.CPU.OK >CSTRING "65C02 CPU (or higher) Detected.\n" MSG.CPU.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n" -MSG.CPU.SPEED >CSTRING "Detecting CPU Speed..." -MSG.CPU.SPEEDOK >CSTRING "%d.%02d Mhz.\n" -MSG.BOOTPREFIX >CSTRING "Boot Prefix:" + MSG.RAMDRV >CSTRING "Checking ProDOS RamDrive..." MSG.RAMDRV.OK >CSTRING "Successfully Disabled.\n" MSG.RAMDRV.KO0 >CSTRING "Not Detected.\n" MSG.RAMDRV.KO1 >CSTRING "Uninstall Failed !!!\n" -MSG.Z80 >CSTRING "Detecting Z80 CPU..." -MSG.Z80.OK >CSTRING "Detected In Slot %d.\n" -MSG.Z80.KO >CSTRING "Not Detected.\n" + +MSG.BOOTPREFIX >CSTRING "Boot Prefix:" + MSG.KMENUM >CSTRING "Looking For Kernel Modules...\n" MSG.KMLOAD >CSTRING "***Loading KM : " -MSG.STAGE0OK >CSTRING "A2osX[Stage0]:Complete.\n" -MSG.CPUTYPEL .DA #MSG.6502 - .DA #MSG.65C02 - .DA #MSG.65R02 - .DA #MSG.65816 -MSG.CPUTYPEH .DA /MSG.6502 - .DA /MSG.65C02 - .DA /MSG.65R02 - .DA /MSG.65816 -MSG.6502 >CSTRING "6502.\n" -MSG.65C02 >CSTRING "65C02.\n" -MSG.65R02 >CSTRING "65R02.\n" -MSG.65816 >CSTRING "65816.\n" +MSG.INIT0OK >CSTRING "A2osX[Stage0]:Complete.\n" *-------------------------------------- MLIGETPREFIX01 .DA #1 .DA Boot.Prefix @@ -459,23 +417,11 @@ MLIQUIT01 .DA #4 *-------------------------------------- SYS >PSTRING "SYS/" KM.PREFIX >PSTRING "KM." -*-------------------------------------- -Z80Code.Start .HS 31FFFF START: LD SP,0FFFFH Init Stack - .HS 3EFF LD A,0FFH Set Flag - .HS 320D00 LD (FLAG),A - .HS 3200E1 LD (0E100H),A Back to 6502 - .HS 18F3 JR START Loop - .HS 00 FLAG: .DB 0 -Z80Code.End .EQ * -Z80Code.Size .EQ Z80Code.End-Z80Code.Start *-------------------------------------- .EP -A2osX.End .EQ * -A2osX.SIZE .EQ A2osX.End-A2osX.Start - .BS $1000-A2osX.SIZE *-------------------------------------- +A2osX.QC.B.Start .INB A2OSX.S.QC - .INB A2OSX.S.GP *-------------------------------------- MAN SAVE A2OSX.S diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index ea9aa1c5..0f896e10 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -8,27 +8,27 @@ echo Env: SET # Main Screen INSDRV CONSOLE.DRV -STARTPROC GETTY CON SBIN/LOGIN +STARTPROC GETTY CON ${A2OSX}SBIN/LOGIN # Serial Login #INSDRV SSC.I.DRV 9600 N 8 1 X -#STARTPROC GETTY COM2 SBIN/LOGIN +#STARTPROC GETTY COM2 LOGIN #INSDRV PIC.DRV # Network Section -INSDRV UTHERNET.DRV 000E3A123456 -INSDRV UTHERNET2.DRV 0008DC123456 +#INSDRV UTHERNET.DRV 000E3A123456 +#INSDRV UTHERNET2.DRV 0008DC123456 #INSDRV UTHER2.AI.DRV 0008DC123456 #INSDRV LANCEGS.DRV -STARTPROC TCPIP -STARTPROC DHCPCLNT +#STARTPROC TCPIP +#STARTPROC DHCPCLNT #STARTPROC HTTPD #TELNETD #MOUNT TFTP 192.168.1.5:/A2OSX /MNT/A2OSX #MOUNT CIFS 192.168.1.5:/MSSHARE /MNT/MSSHARE # End Network Section # GUI Section -#INSDRV DHGR.DRV -#INSDRV MOUSE.DRV -#DESKTOP +INSDRV DHGR.DRV +INSDRV MOUSE.DRV +STARTPROC DESKTOP # End GUI Section ECHO *** End A2osX Startup file *** MAN diff --git a/BIN/ASM.S.FIO.txt b/BIN/ASM.S.FIO.txt index 2f3038eb..0556ea72 100644 --- a/BIN/ASM.S.FIO.txt +++ b/BIN/ASM.S.FIO.txt @@ -70,7 +70,8 @@ FIO.OpenFileA sta FIO.hFileName bra FIO.OpenFileA.Exit .10 lda FIO.hFileName - >SYSCALL SYS.MLIOpenA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.MLIOpenYA bcs .99 pha @@ -91,7 +92,8 @@ FIO.OpenFileA sta FIO.hFileName sta (pData),y lda FIO.hFileName - >SYSCALL SYS.MLIGetFileInfoA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.MLIGetFileInfoYA bcs .99 >STYA ZPPtr1 diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 1f0f888e..818233f3 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -1,6 +1,6 @@ PR#3 PREFIX /A2OSX.SRC -NEW +LOMEM $C00 INC 1 AUTO 6 .LIST OFF diff --git a/BIN/EDIT.S.txt b/BIN/EDIT.S.txt index 6c8456d0..eacae668 100644 --- a/BIN/EDIT.S.txt +++ b/BIN/EDIT.S.txt @@ -131,7 +131,8 @@ CS.INIT stz hFile .2 ldy #hFileName sta (pData),y - >SYSCALL SYS.LoadFileA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.LoadFileYA bcs .3 stx hFile @@ -415,7 +416,8 @@ SaveFile >PUSHWI 0 Aux type .1 ldy #hFileName lda (pData),y - >SYSCALL SYS.MLIOpenA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.MLIOpenYA bcs .9 sta hFile stx TmpByte diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt index 9058c9ac..560fbf08 100644 --- a/BIN/LSDEV.S.txt +++ b/BIN/LSDEV.S.txt @@ -41,8 +41,10 @@ L.MSG1 .DA MSG1 *-------------------------------------- CS.INIT >LDYA L.LIBSTR >SYSCALL SYS.LoadLibYA - bcs .9 - sta hLIBSTR + bcc .1 + rts + +.1 sta hLIBSTR >LDYAI DevMgr.Table >STYA ZPPTR1 @@ -51,23 +53,27 @@ CS.INIT >LDYA L.LIBSTR >PUSHW L.MSG0 >LIBCALL hLIBSTR,LIBSTR.PRINTF -.1 lda (ZPPTR1) +.2 lda (ZPPTR1) cmp #$D8 bne .8 + ldy #S.DEV.JMP+1 + >PUSHB (ZPPTR1),y + dey + >PUSHB (ZPPTR1),y + lda ZPPTR1 clc adc #S.DEV.NAME - sta ZPPTR2 + tay lda ZPPTR1+1 adc #0 - sta ZPPTR2+1 - >PUSHW ZPPTR2 + >PUSHYA ldy #S.DEV.F - lda (ZPPTR1),y push flags - >PUSHA - >PUSHB DEV.ID + >PUSHB (ZPPTR1),y + ldy #S.DEV.ID + >PUSHB (ZPPTR1),y >PUSHW L.MSG1 >LIBCALL hLIBSTR,LIBSTR.PRINTF @@ -81,7 +87,7 @@ CS.INIT >LDYA L.LIBSTR .3 inc DEV.ID lda DEV.ID cmp #K.DEV.MAX - bne .1 + bne .2 .8 lda #0 tell TSKMGR that all done ok, but .9 sec we do not want to stay in memory @@ -98,8 +104,8 @@ CS.QUIT lda hLIBSTR *-------------------------------------- CS.END LIBSTR >PSTRING "libstr.o" -MSG0 >CSTRING "ID Flags Name\n" -MSG1 >CSTRING "%03d %b %4S\n" +MSG0 >CSTRING "ID Flags Name Address\n" +MSG1 >CSTRING "%03d %b %4S $%H\n" hLIBSTR .BS 1 DEV.ID .BS 1 MAN diff --git a/BIN/MD.S.txt b/BIN/MD.S.txt index 198d43fb..728b26da 100644 --- a/BIN/MD.S.txt +++ b/BIN/MD.S.txt @@ -62,7 +62,8 @@ CS.INIT stz hFullPath >SYSCALL SYS.PStrCat sta hFullPath -.2 >SYSCALL SYS.MLICreateDirA +.2 >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.MLICreateDirYA php pha jsr .98 diff --git a/BIN/NFSMOUNT.S.txt b/BIN/NFSMOUNT.S.txt new file mode 100644 index 00000000..0f6a3b23 --- /dev/null +++ b/BIN/NFSMOUNT.S.txt @@ -0,0 +1,109 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/BIN/NFSMOUNT +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +TIMEOUT.MAX .EQ 40 40*100ms = 4 sec. +*-------------------------------------- +ZPIPCfgPtr .EQ ZPBIN +ZPFrameBase .EQ ZPBIN+2 +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIBTCPIP .DA LIBTCPIP +L.MSG.USAGE .DA MSG.USAGE + .DA 0 +*-------------------------------------- +CS.INIT ldy #S.PS.hARGS + lda (pPs),y + beq .99 + + >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? + bcs .99 + >STYA ZPIPCfgPtr + + lda (ZPIPCfgPtr) Configured ? + bpl .99 + + ldx #3 + ldy #S.IPCFG.IP+3 +.1 lda (ZPIPCfgPtr),y + sta Socket.Src.Addr,x + dey + dex + bpl .1 + + lda (pPs) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc + rts + +.99 >LDYA L.MSG.USAGE + >SYSCALL SYS.PSTROutYA + lda #SYSMGR.ERRSYN + sec + rts + +*-------------------------------------- +CS.RUN +CS.RUN.ERROR sec + rts +*-------------------------------------- +CS.DOEVENT +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +CS.END +MSG.USAGE >PSTRING "Usage : NFSMOUNT [HOST | IP]/export /mountvol\n" +LIBTCPIP >PSTRING "libtcpip.o" +hLIBTCPIP .BS 1 +Socket .DA #S.SOCKET.SOCK.DGRAM + .BS 3 +Socket.Src.Addr .BS 4 +Socket.Src.Port .DA 0 Dynamic +Socket.Dst.Addr .BS 4 +Socket.Dst.Port .DA UDP.PORT.PMAP + .BS 16 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +bCTRLC .BS 1 +DS.END + .ED +*-------------------------------------- +MAN +SAVE BIN/NFSMOUNT.S +ASM diff --git a/BIN/TEST.S.txt b/BIN/TEST.S.txt index 0018eb3f..791924c9 100644 --- a/BIN/TEST.S.txt +++ b/BIN/TEST.S.txt @@ -108,8 +108,6 @@ CS.RUN ldy #bCTRLC *-------------------------------------- CS.DOEVENT lda (pEvent) - >DEBUG - bpl .1 is it a TIMER event? ora #'T' diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index 784def0a..efe157f4 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -39,9 +39,6 @@ L.MSG.DETECT .DA MSG.DETECT Dev.Detect >LDYA L.MSG.DETECT >SYSCALL SYS.PSTROutYA - lda A2osX.SCREENS - ora #A2osX.SCREENS.C - sta A2osX.SCREENS clc rts CS.END @@ -51,10 +48,11 @@ MSG.DETECT >PSTRING "Apple IIe/IIc 80 Col Driver.\n" *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) + .HS 00 DevID .DA #S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR >PSTRING "CON" NAME .HS 00 NAME must Be 5 bytes long - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code @@ -65,6 +63,7 @@ DRV.CS.START .DA OPEN .DA CLOSE .DA GETINFO .DA IRQ + .DA SELECT L.DEVINFO .DA DEVINFO *-------------------------------------- J.CtrlChars .DA BS 8 @@ -92,12 +91,15 @@ OPEN stz CURON stz OutPtr stz OutCnt + ldy #S.DEV.ID + lda (pDev),y + sta A2osX.SCRNDEVS + + jsr SELECT + lda #1 + sta A2osX.ASCREEN jsr RESET jsr HOME - - lda #A2osX.SCREENS.C - >SYSCALL SYS.ScreenSelectA - clc rts *-------------------------------------- @@ -110,16 +112,17 @@ GETEVENT lda A2osX.TIMER16 .1 jsr Char.Out.Get bcc .7 - lda A2osX.ASCREEN - and #A2osX.SCREENS.C is screen active? - beq .9 - >SYSCALL SYS.GetKeyboardEvent bcs .9 ldy #S.EVT.DATAHI lda (pEvent),y bne .8 + + lda A2osX.ASCREEN + cmp #1 + bne .9 + dey lda (pEvent),y @@ -172,6 +175,14 @@ COUT bit bEscMode jsr SetCharAtXY jmp FSOUT *-------------------------------------- +SELECT sta SETTEXT + sta SETALTCHAR + sta SET80DISP + sta CLR80STORE + sta CLRPAGE2 + clc + rts +*-------------------------------------- COUT.Ctrl ldy #0 ldx #0 @@ -300,10 +311,7 @@ COUT.ExecEscSeq stz EscSeqParamCnt .5 jmp (J.EscSequences,x) *-------------------------------------- -CLOSE -* lda A2osX.SCREENS -* and #$FF^A2osX.SCREENS.C -* sta A2osX.SCREENS +CLOSE stz A2osX.SCRNDEVS clc rts *-------------------------------------- @@ -621,8 +629,8 @@ CUROFF lda CURON beq CUREXIT.RTS CURBLNK lda A2osX.ASCREEN - and #A2osX.SCREENS.C - bne CURBLNK1 + cmp #1 + beq CURBLNK1 lda CURON bne CURBLNK.OFF diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt index 1f235295..5430bb68 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -35,10 +35,6 @@ L.MSG.DETECT .DA MSG.DETECT Dev.Detect >LDYA L.MSG.DETECT >SYSCALL SYS.PSTROutYA - lda A2osX.SCREENS - ora #A2osX.SCREENS.G - sta A2osX.SCREENS - clc rts CS.END @@ -48,10 +44,11 @@ MSG.DETECT >PSTRING "\nApple IIe/IIc DHGR Driver.\n" *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) + .HS 00 DevID .DA #S.DEV.F.EVENT >PSTRING "GFX" NAME .HS 00 NAME must Be 5 bytes long - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code @@ -62,6 +59,7 @@ DRV.CS.START .DA OPEN .DA CLOSE .DA GETINFO .DA IRQ + .DA SELECT .DA SETPIXEL .DA GETPIXEL .DA HLINE @@ -71,47 +69,24 @@ DRV.CS.START .DA OPEN L.DEVINFO .DA DEVINFO .DA 0 end or relocation *-------------------------------------- -OPEN lda #A2osX.SCREENS.G - >SYSCALL SYS.ScreenSelectA - - ldx #192 +OPEN ldy #S.DEV.ID + lda (pDev),y + sta A2osX.SCRNDEVS+2 -.81 dex - - lda BASEL,x - sta ZPBASE - lda BASEH,x - sta ZPBASE+1 - -* lda #$55 - lda #$00 - - ldy #39 - sta SETWRITEAUX -.82 sta (ZPBASE),y - dey - bpl .82 - -* lda #$2A - lda #$00 - - ldy #39 - sta CLRWRITEAUX -.83 sta (ZPBASE),y - dey - bpl .83 + jsr SELECT + lda #3 + sta A2osX.ASCREEN - txa - bne .81 clc rts *-------------------------------------- GETEVENT lda A2osX.ASCREEN - and #A2osX.SCREENS.G is screen active? - beq .9 + cmp #3 + bne .9 >SYSCALL SYS.GetKeyboardEvent bcs .9 + rts .9 lda #0 Error = no event @@ -129,6 +104,24 @@ GETINFO >LDYA L.DEVINFO clc rts *-------------------------------------- +SELECT sta CLRTEXT + sta CLRMIXED + sta SETHIRES + sta CLR80STORE + sta CLRPAGE2 + sta SETIOUDIS + sta SETDHIRES + +* sta CLR80DISP +* sta SETDHIRES +* sta CLRDHIRES +* sta SET80DISP +* sta SETDHIRES +* sta CLRDHIRES +* sta SETDHIRES + clc + rts +*-------------------------------------- * SETPIXEL * PULLB = Mode * 00000001=B/W @@ -162,6 +155,7 @@ SETPIXEL.XOR >PULLYA Y=X.LO,A=X.HI .3 lsr tay + sta CLRPAGE2 bcs .4 odd=main ram sta SETPAGE2 diff --git a/DRV/MOUSE.DRV.S.txt b/DRV/MOUSE.DRV.S.txt index 8ffbba40..7e4f261e 100644 --- a/DRV/MOUSE.DRV.S.txt +++ b/DRV/MOUSE.DRV.S.txt @@ -117,14 +117,18 @@ CS.END MSG.DETECT >PSTRING "Apple Mouse Card/IIc Mouse Driver.\n" MSG.DETECT.OK >PSTRING "Mouse Installed As Device : " MSG.DETECT.KO >PSTRING "No Mouse Found.\n" +DEVSIG.Offset .HS 05070B0CFB +DEVSIG.Value .HS 38180120D6 +DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) + .HS 00 DevID .DA #S.DEV.F.EVENT DEV.HEADER.NAME >PSTRING "MOU1" NAME - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code @@ -135,6 +139,7 @@ DRV.CS.START .DA OPEN .DA CLOSE .DA GETINFO .DA IRQ + .DA SELECT L.DEVINFO .DA DEVINFO .DA 0 end or relocation *-------------------------------------- @@ -181,8 +186,8 @@ OPEN rts *-------------------------------------- GETEVENT lda A2osX.ASCREEN - and #A2osX.SCREENS.G is screen active? - beq .9 + cmp #3 is DHGR screen active? + bne .9 php sei @@ -245,7 +250,9 @@ GETEVENT lda A2osX.ASCREEN rts *-------------------------------------- COUT -IRQ sec +IRQ +SELECT lda #DEVMGR.ERRUNSUP + sec rts *-------------------------------------- CLOSE php @@ -272,9 +279,6 @@ GOMOUSE pha jmp (ZPGoMouse) *-------------------------------------- DRV.CS.END -DEVSIG.Offset .HS 05070B0CFB -DEVSIG.Value .HS 38180120D6 -DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset DEVSLOT0n .BS 1 DEVSLOTn0 .BS 1 DEVSLOTCn .BS 1 diff --git a/DRV/UTHER2.AI.DRV.S.txt b/DRV/UTHER2.AI.DRV.S.txt index 6713bb53..82d6eea9 100644 --- a/DRV/UTHER2.AI.DRV.S.txt +++ b/DRV/UTHER2.AI.DRV.S.txt @@ -41,10 +41,10 @@ W5100.AR.RCR .EQ $0019 W5100.AR.RMSR .EQ $001A W5100.AR.TMSR .EQ $001B W5100.AR.PATR .EQ $001C -W5100.AR.PTIMER .EQ $0028 -W5100.AR.PMAGIC .EQ $0029 -W5100.AR.UIPR .EQ $002A -W5100.AR.UPORT .EQ $002E +*W5100.AR.PTIMER .EQ $0028 +*W5100.AR.PMAGIC .EQ $0029 +*W5100.AR.UIPR .EQ $002A +*W5100.AR.UPORT .EQ $002E W5100.AR.S0.MR .EQ $0400 W5100.AR.S0.MR.MULTI .EQ $80 W5100.AR.S0.MR.MF .EQ $40 @@ -183,9 +183,10 @@ hArgs .BS 1 *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) + .HS 00 .DA #S.DEV.F.SHARE+S.DEV.F.EVENT DEV.HEADER.NAME >PSTRING "ETH1" NAME - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code diff --git a/DRV/UTHERNET.DRV.S.txt b/DRV/UTHERNET.DRV.S.txt index 42990dac..6b0d078e 100644 --- a/DRV/UTHERNET.DRV.S.txt +++ b/DRV/UTHERNET.DRV.S.txt @@ -43,14 +43,14 @@ PP.RxCTL.ExtradataA .EQ %01000000.00000000 PP.TxCFG .EQ $0106 Transmit Configuration (RW) PP.TxCMD .EQ $0108 Receiver Control (RW) PP.TxCMD.LID .EQ %00000000.00001001 -PP.TxCMD.TxStart5 .EQ %00000000.00000000 -PP.TxCMD.TxStart381 .EQ %00000000.01000000 -PP.TxCMD.TxStart1021 .EQ %00000000.10000000 +*PP.TxCMD.TxStart5 .EQ %00000000.00000000 +*PP.TxCMD.TxStart381 .EQ %00000000.01000000 +*PP.TxCMD.TxStart1021 .EQ %00000000.10000000 PP.TxCMD.TxStartFULL .EQ %00000000.11000000 -PP.TxCMD.Force .EQ %00000001.00000000 -PP.TxCMD.OneColl .EQ %00000010.00000000 -PP.TxCMD.InhibitCRC .EQ %00010000.00000000 -PP.TxCMD.TxPadDis .EQ %00100000.00000000 +*PP.TxCMD.Force .EQ %00000001.00000000 +*PP.TxCMD.OneColl .EQ %00000010.00000000 +*PP.TxCMD.InhibitCRC .EQ %00010000.00000000 +*PP.TxCMD.TxPadDis .EQ %00100000.00000000 PP.BufCFG .EQ $010A PP.LineCTL .EQ $0112 Line Control (RW) PP.LineCTL.LID .EQ %00000000.00010011 @@ -200,9 +200,10 @@ hArgs .BS 1 *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) + .HS 00 .DA #S.DEV.F.SHARE+S.DEV.F.EVENT DEV.HEADER.NAME >PSTRING "ETH1" NAME - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code @@ -241,7 +242,6 @@ OPEN jsr Reset >STYA PacketPagePTR,x >LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto >STYA PacketPageDATA,x - clc rts *-------------------------------------- @@ -252,7 +252,6 @@ GETEVENT ldx DEVSLOTx0 and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA bne GETEVENT.RxOK lda #ERR.DEV.NOFRAME - COUT IRQ SETIPCFG @@ -443,18 +442,15 @@ Reset ldx DEVSLOTx0 >LDYAI PP.SelfCTL.LID+PP.SelfCTL.RESET >STYA PacketPageDATA,x rts -*-------------------------------------- DRV.CS.END *-------------------------------------- DEVSLOTx0 .BS 1 Size .BS 2 Counter .BS 2 -*-------------------------------------- DEVINFO .DA #S.DEVINFO.TYPE.NET DEVFLAGS .DA #0 MAC .BS 6 LINK.STATUS .BS 1 OK/DUPLEX/SPEED -*-------------------------------------- MAN SAVE DRV/UTHERNET.DRV.S ASM diff --git a/DRV/UTHERNET2.DRV.S.txt b/DRV/UTHERNET2.DRV.S.txt index bd1c2c02..3b12f546 100644 --- a/DRV/UTHERNET2.DRV.S.txt +++ b/DRV/UTHERNET2.DRV.S.txt @@ -183,9 +183,10 @@ hArgs .BS 1 *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) + .HS 00 .DA #S.DEV.F.SHARE+S.DEV.F.EVENT DEV.HEADER.NAME >PSTRING "ETH1" NAME - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 5852b1ae..23e629c8 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -113,30 +113,26 @@ pLibJmp .EQ $BE16 *-------------------------------------- MLICALL.PARAMS .EQ $BEC0 *-------------------------------------- -* $BEE0->$BEFF : Public Variables +* $BEE0->$BEEF : Public Variables *-------------------------------------- -A2osX.SCREENS .EQ $BEE0 -A2osX.SCREENS.S .EQ %00000001 System Screen -A2osX.SCREENS.C .EQ %00000010 Console Screen -A2osX.SCREENS.G .EQ %00000100 Graphic Screen -A2osX.SCREENS.2 .EQ %00001000 Graphic Screen2 -A2osX.ASCREEN .EQ $BEE1 Active Screen +A2osX.ASCREEN .EQ $BEE0 Active Screen +A2osX.SCRNDEVS .EQ $BEE1 -> $BEE4 (4 devices) -A2osX.SCRNDEVS .EQ $BEE2 -> $BEE5 (4 devices) A2osX.CPUTYPE .EQ $BEE6 A2osX.CPUSPEED .EQ $BEE7 (->255.99 Mhz) A2osX.Z80SLOT .EQ $BEEA -A2osX.HZ .EQ $BEEB - A2osX.TIMER16 .EQ $BEEC A2osX.RANDOM16 .EQ $BEEE *-------------------------------------- +* $BEF0->$BEFF : Kernel Config Block +*-------------------------------------- +A2osX.HZ .EQ $BEF0 +*-------------------------------------- * Kernel Entry Point *-------------------------------------- -KERNEL.SYSCALL .EQ $D000 -KERNEL.COLDBOOT .EQ $D100 +KERNEL.SYSCALL .EQ $E000 *-------------------------------------- H.BIN.HEADER .EQ 0 H.BIN.HEADER.DRV65 .EQ $4CD8 6502:cld,jmp abs @@ -161,8 +157,10 @@ SYS.FreeMemA .EQ $02 SYS.GetMemPtrA .EQ $04 SYS.GetMemByIDA .EQ $06 -SYS.GetMemByNameA .EQ $08 -SYS.GetMemByNameYA .EQ $0A +SYS.GetMemByNameYA .EQ $08 +SYS.LoadStockObjectYA .EQ $0A +SYS.GetStockObjectA .EQ $0C +SYS.FreeStockObject .EQ $0E *-------------------------------------- SYS.NewPStrYA .EQ $10 SYS.PStrCpyA .EQ $12 @@ -174,14 +172,14 @@ SYS.PStrGetTkn .EQ $18 SYS.GetArgCount .EQ $1C SYS.GetArgA .EQ $1E *-------------------------------------- -SYS.LoadBinA .EQ $20 + SYS.LoadLibYA .EQ $22 SYS.UnloadLibA .EQ $24 SYS.LoadDrvA .EQ $26 *-------------------------------------- SYS.ExpandPStrA .EQ $30 SYS.ExpandPStrYA .EQ $32 -SYS.GetEnvVarA .EQ $34 +SYS.PutEnvYA .EQ $34 SYS.GetEnvVarYA .EQ $36 SYS.SetEnvVarH .EQ $38 @@ -190,23 +188,21 @@ SYS.DelEnvVarA .EQ $3C SYS.DelEnvVarYA .EQ $3E *-------------------------------------- SYS.MLICreateFile .EQ $40 -SYS.MLICreateDirA .EQ $42 + SYS.MLICreateDirYA .EQ $44 -SYS.MLIDestroyA .EQ $46 SYS.MLIDestroyYA .EQ $48 SYS.MLIRename .EQ $4A SYS.MLISetFileInfo .EQ $4C -SYS.MLIGetFileInfoA .EQ $4E + SYS.MLIGetFileInfoYA .EQ $50 SYS.MLIOnline .EQ $52 -SYS.MLISetPrefixA .EQ $54 + SYS.MLISetPrefixYA .EQ $56 -SYS.MLIGetPrefixA .EQ $58 SYS.MLIGetPrefixYA .EQ $5A -SYS.MLIOpenA .EQ $5C + SYS.MLIOpenYA .EQ $5E SYS.MLINewLine .EQ $60 @@ -230,7 +226,7 @@ SYS.MLIReadBlock .EQ $7C SYS.MLIWriteBlock .EQ $7E *-------------------------------------- SYS.GetDevByIDA .EQ $80 -SYS.GetDevByNameA .EQ $82 + SYS.GetDevByNameYA .EQ $84 SYS.GetDevInfoA .EQ $86 @@ -247,7 +243,7 @@ SYS.Sleep .EQ $9C *-------------------------------------- SYS.CheckPrefixA .EQ $A0 SYS.FileSearch .EQ $A2 -SYS.LoadFileA .EQ $A4 + SYS.LoadFileYA .EQ $A6 SYS.ListDirInitA .EQ $A8 @@ -260,16 +256,41 @@ SYS.SetNetCfg .EQ $B2 SYS.GetNetCfgA .EQ $B4 SYS.ClrNetCfgA .EQ $B6 *-------------------------------------- -SYS.ScreenSelectA .EQ $C0 +*SYS.ScreenSelectA .EQ $C0 *-------------------------------------- SYS.COutA .EQ $D0 -SYS.PSTROutA .EQ $D2 + SYS.PSTROutYA .EQ $D4 SYS.HexOutA .EQ $D8 SYS.HexOutYA .EQ $DA SYS.DecOutA .EQ $DC SYS.DecOutYA .EQ $DE + +*SYS.FGETC .EQ $F0 +*SYS.FGETS .EQ $F2 +*SYS.FPUTC .EQ $F4 +*SYS.FPUTS .EQ $F6 +*-------------------------------------- +SYS.FOPEN .EQ $E0 +SYS.FCLOSE .EQ $E2 +SYS.FREAD .EQ $E4 +SYS.FWRITE .EQ $E6 + +SYS.FFLUSH .EQ $E8 +SYS.FSEEK .EQ $EA +SYS.FTELL .EQ $EC +SYS.FEOF .EQ $EE + +SYS.REMOVE .EQ $F0 +SYS.RENAME .EQ $F2 +SYS.OPENDIR .EQ $F4 +SYS.READDIR .EQ $F6 + +SYS.CLOSEDIR .EQ $F8 +SYS.MKDIR .EQ $FA +SYS.MKNOD .EQ $FC +SYS.MKFIFO .EQ $FE *-------------------------------------- S.FINFO.ACCESS .EQ $00 S.FINFO.TYPE .EQ $01 @@ -324,6 +345,7 @@ DEVMGR.ERROOH .EQ $EE Out Of Handle Error DEVMGR.ERRICL .EQ $ED Invalid Command Line DEVMGR.ERRNOHW .EQ $EC No Hardware DEVMGR.ERRDNF .EQ $EB Device Not Found Error +DEVMGR.ERRUNSUP .EQ $EA Unsupported Function *-------------------------------------- TSKMGR.ERROOH .EQ $DF Out Of Handle Error TSKMGR.ERRNSP .EQ $DD No Such Process Error @@ -353,9 +375,10 @@ S.MEM.SIZE .EQ 8 *-------------------------------------- * DEV STRUCT *-------------------------------------- -S.DEV.CODE .EQ 0 -S.DEV.JMP .EQ 2 -S.DEV.F .EQ 4 +S.DEV.CODE .EQ 0 cld,jmp... +S.DEV.JMP .EQ 2 ...(code,x) +S.DEV.ID .EQ 4 +S.DEV.F .EQ 5 S.DEV.F.INUSE .EQ %10000000 S.DEV.F.BUSY .EQ %01000000 S.DEV.F.SHARE .EQ %00100000 Device is shareable @@ -364,7 +387,7 @@ S.DEV.F.EVENT .EQ %00001000 Device is event driven S.DEV.F.COUT .EQ %00000100 Device supports Char OUT S.DEV.F.BLOCK .EQ %00000010 S.DEV.F.CHAR .EQ %00000001 -S.DEV.NAME .EQ 5 5 Bytes : LEN+NUL KBD CON COMx LPTx ETHx +S.DEV.NAME .EQ 6 5 Bytes : LEN+NUL KBD CON COMx LPTx ETHx * S.DEV.SIZE .EQ 16 *-------------------------------------- @@ -393,9 +416,7 @@ DEVMGR.CLOSE .EQ 6 DEVMGR.GETINFO .EQ 8 DEVMGR.IRQ .EQ 10 *-------------------------------------- -* 'XY' Class Driver Functions -*-------------------------------------- -DEVMGR.XY.SETPOS .EQ 12 +DEVMGR.SELECT .EQ 12 *-------------------------------------- * 'NET' Class Driver Functions *-------------------------------------- @@ -404,11 +425,11 @@ DEVMGR.SETIPCFG .EQ 14 *-------------------------------------- * 'GFX' Class Driver Functions *-------------------------------------- -DEVMGR.GFX.SETPIXEL .EQ 12 -DEVMGR.GFX.GETPIXEL .EQ 14 -DEVMGR.GFX.HLINE .EQ 16 -DEVMGR.GFX.VLINE .EQ 18 -DEVMGR.GFX.BITBLT .EQ 20 +DEVMGR.GFX.SETPIXEL .EQ 14 +DEVMGR.GFX.GETPIXEL .EQ 16 +DEVMGR.GFX.HLINE .EQ 18 +DEVMGR.GFX.VLINE .EQ 20 +DEVMGR.GFX.BITBLT .EQ 22 *-------------------------------------- * PS STRUCT *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 2e315737..47e8fb58 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -121,27 +121,27 @@ TCP.IN.LISTEN.NEW phy pha - - ldy #S.SOCKET.STATUS - lda #S.SOCKET.STATUS.SYNRCVD - sta (ZPPtrSKT),y - txa - ldy #S.SOCKET.PARENT - sta (ZPPtrSKT),y + + jsr SKT.AddToQueueL pla sta ZPPtrSKT+1 pla sta ZPPtrSKT - jsr TCP.SendSYNACK + bcc .3 - - - - clc + lda #0 error + sta (ZPPtrSKT) clear this socket + lda #ERR.SKT.OOS .9 rts + +.3 ldy #S.SOCKET.STATUS + lda #S.SOCKET.STATUS.SYNRCVD + sta (ZPPtrSKT),y + + jmp TCP.SendSYNACK *-------------------------------------- TCP.IN.ESTABLISHED stx hSocket @@ -204,13 +204,6 @@ TCP.IN.ESTABLISHED ldy #S.SOCKET.SQ.hOutMem sta (ZPPtrSKT),y - ldy #S.SOCKET.PARENT - lda (ZPPtrSKT),y - jsr SKT.GetA - - lda hSocket - jsr SKT.AddToQueueL - .8 clc rts diff --git a/SBIN/DESKTOP.S.txt b/SBIN/DESKTOP.S.txt index 940ad974..6ca80e1e 100644 --- a/SBIN/DESKTOP.S.txt +++ b/SBIN/DESKTOP.S.txt @@ -31,16 +31,20 @@ CS.START cld .DA CS.QUIT L.DEVNAME.GFX .DA DEVNAME.GFX L.DEVNAME.MOUSE .DA DEVNAME.MOUSE +L.MSG.INIT .DA MSG.INIT .DA 0 *-------------------------------------- -CS.INIT >LDYA L.DEVNAME.GFX +CS.INIT >LDYA L.MSG.INIT + >SYSCALL SYS.PSTROutYA + + >LDYA L.DEVNAME.GFX >SYSCALL SYS.GetDevByNameYA bcc .10 rts .10 stx hDevGFX >STYA pDevGFX - + .11 >LDYA L.DEVNAME.MOUSE >SYSCALL SYS.GetDevByNameYA bcc .20 @@ -54,17 +58,27 @@ CS.INIT >LDYA L.DEVNAME.GFX .20 stx hDevMouse >STYA pDevMouse - + ldx #DEVMGR.OPEN jsr GoDevMouse - bcs * + + lda pDev + pha + lda pDev+1 + pha + + lda pDevGFX + sta pDev + lda pDevGFX+1 + sta pDev+1 ldx #DEVMGR.OPEN jsr GoDevGFX - bcs * - - lda #A2osX.SCREENS.G - >SYSCALL SYS.ScreenSelectA + + pla + sta pDev+1 + pla + sta pDev * jmp .8 @@ -108,8 +122,10 @@ CS.INIT >LDYA L.DEVNAME.GFX beq .8 and #$7 bne .1 + dec C bpl .1 + lda #15 sta C bra .1 @@ -153,7 +169,7 @@ CS.DOEVENT ldy #S.EVT.hDEV lda (pEvent),y >PUSHA X.LO - >PUSHBI 2 Mode:1=B/W,2=16 colors,...,128=XOR + >PUSHBI 128 Mode:1=B/W,2=16 colors,...,128=XOR ldx #DEVMGR.GFX.SETPIXEL jsr GoDevGFX @@ -172,6 +188,7 @@ GoDevMouse jmp (pDevMouse) CS.END DEVNAME.GFX >PSTRING "GFX" DEVNAME.MOUSE >PSTRING "MOU1" +MSG.INIT >PSTRING "DESKTOP:Init...\n" hDevGFX .BS 1 pDevGFX .BS 2 hDevMouse .BS 1 diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 0f5476d2..175f6af2 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -52,10 +52,12 @@ CS.INIT ldy #S.PS.hARGS bcs .99 sta hDEVNAME - >SYSCALL SYS.GetDevByNameA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.GetDevByNameYA bcs .98 >STYA pDev + txa ldy #S.PS.hINDEV sta (pPs),y @@ -67,20 +69,22 @@ CS.INIT ldy #S.PS.hARGS lda hDEVNAME >SYSCALL SYS.FreeMemA + ldx #DEVMGR.OPEN + jsr pDevJmp + bcs .99 + ldy #S.PS.hARGS lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' - >PUSHBI 2 Push 3 for getting BIN + >PUSHBI 2 Push 2 for getting BIN >SYSCALL SYS.PStrGetTkn bcs .99 ldy #hBinName sta (pData),y - - ldx #DEVMGR.OPEN - jsr pDevJmp if error CS, else... - rts ...Tell TskMgr To stay in memory + clc + rts .98 pha lda hDEVNAME @@ -89,25 +93,23 @@ CS.INIT ldy #S.PS.hARGS sec .99 rts *-------------------------------------- -CS.RUN lda #12 try send a FF... +CS.RUN lda #13 try send a CR... >SYSCALL SYS.COutA Device Is Ready ? bcs .8 no..loop... - -.1 >LDYA L.MSG.GREETINGS + + lda pDev + clc + adc #S.DEV.NAME + tay + lda pDev+1 + adc /S.DEV.NAME + >PUSHYA + >LDYA L.MSG.GREETINGS >SYSCALL SYS.PSTROutYA bcs .8 unable to send greetings...loop.. - ldy #S.PS.hOUTDEV - lda (pPs),y - >SYSCALL SYS.HexOutA - bcs .8 - - lda #13 - >SYSCALL SYS.COutA - bcs .8 - ldy #hBinName lda (pData),y ldy #0 @@ -125,14 +127,14 @@ CS.QUIT ldy #hBinName >SYSCALL SYS.FreeMemA ldx #DEVMGR.CLOSE - jsr pDevJmp +* jsr pDevJmp clc rts *-------------------------------------- CS.END MSG.USAGE >PSTRING "GETTY " -MSG.GREETINGS >PSTRING "\e[12h\nA2osX-GeTTY on Dev=" +MSG.GREETINGS >PSTRING "\e[12h\nA2osX-GeTTY on Dev=%S\n" hDEVNAME .BS 1 *-------------------------------------- .DUMMY diff --git a/SBIN/INSDRV.S.txt b/SBIN/INSDRV.S.txt index c3d0fdaf..b3dea2c5 100644 --- a/SBIN/INSDRV.S.txt +++ b/SBIN/INSDRV.S.txt @@ -43,8 +43,7 @@ CS.INIT ldy #S.PS.hARGS >SYSCALL SYS.PSTROutYA bra .8 -.1 sta hArgs - >SYSCALL SYS.LoadDrvA +.1 >SYSCALL SYS.LoadDrvA bcs .9 @@ -60,7 +59,6 @@ CS.QUIT clc *-------------------------------------- CS.END MSG.HELP >PSTRING "Usage: insdrv file.drv \n" -hArgs .BS 1 MAN SAVE SBIN/INSDRV.S ASM diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index c826482e..a395b70d 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -120,7 +120,8 @@ EXEC.CMD.EXT ldy #1 .10 bcs .9 sta hFullCmd - >SYSCALL SYS.MLIGetFileInfoA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.MLIGetFileInfoYA bcs .9 >STYA ZPPTR1 @@ -170,7 +171,8 @@ EXEC.CMD.CD lda hExecArgs bne EXEC.CMD.CD.C ldy #S.PS.hPREFIX lda (pPs),y - >SYSCALL SYS.PSTROutA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.PSTROutYA lda #13 >SYSCALL SYS.COutA clc @@ -342,16 +344,19 @@ EXEC.CMD.SETVAR >PUSHA Push Cmd Line bra .97 .4 lda hVarName - >SYSCALL SYS.GetEnvVarA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.GetEnvVarYA bcs .97 sta hVarValue lda hVarName - >SYSCALL SYS.PSTROutA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.PSTROutYA lda #'=' >SYSCALL SYS.COutA lda hVarValue - >SYSCALL SYS.PSTROutA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.PSTROutYA lda #13 >SYSCALL SYS.COutA @@ -392,7 +397,8 @@ EXEC.CMD.ECHO lda hExecArgs bcs .99 pha - >SYSCALL SYS.PSTROutA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.PSTROutYA lda #13 >SYSCALL SYS.COutA pla @@ -406,7 +412,8 @@ EXEC.CMD.ECHO lda hExecArgs *-------------------------------------- EXEC.CMD.TYPE lda hExecArgs beq .98 - >SYSCALL SYS.LoadFileA + >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.LoadFileYA bcs .99 >STYA ZPPTR2 store file len diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index adfb69e3..9dd8cd17 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -378,7 +378,8 @@ CmdBuffer.DEL lda (pData) sta (pData) .9 rts *-------------------------------------- -OpenTxtFileA >SYSCALL SYS.MLIOpenA +OpenTxtFileA >SYSCALL SYS.GetMemPtrA + >SYSCALL SYS.MLIOpenYA bcs .9 ldy #hInputFile diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index bfc72516..5471fc9a 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -30,8 +30,8 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path .2 dey bne .1 - lda S.LoadBinA.hFilename - jsr S.GetMemByNameA + >LDYA ZPQuickPtr1 + jsr S.GetMemByNameYA bcs .3 not already loaded >STYA ZPQuickPtr1 Save base address @@ -49,8 +49,8 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path clc rts -.3 lda S.LoadBinA.hFilename - jsr S.LoadFileA +.3 >LDYA ZPQuickPtr1 + jsr S.LoadFileYA bcc .4 rts Error Loading file @@ -68,7 +68,8 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path sta R.AH lda S.LoadBinA.hFilename - jsr S.MLIGetFileInfoA Get File Info for AUXTYPE + jsr S.GetMemPtrA + jsr S.MLIGetFileInfoYA Get File Info for AUXTYPE bcs .98 >STYA ZPQuickPtr2 diff --git a/SYS/KERNEL.S.CIO.txt b/SYS/KERNEL.S.CIO.txt index 372192d5..60087441 100644 --- a/SYS/KERNEL.S.CIO.txt +++ b/SYS/KERNEL.S.CIO.txt @@ -117,7 +117,6 @@ S.COutA.RTS rts * \e : ESC * \n : CR *-------------------------------------- -S.PSTROutA jsr S.GetMemPtrA S.PSTROutYA >STYA ZPQuickPtr1 ldy #0 diff --git a/SYS/KERNEL.S.CPU.txt b/SYS/KERNEL.S.CPU.txt new file mode 100644 index 00000000..3bb3fa46 --- /dev/null +++ b/SYS/KERNEL.S.CPU.txt @@ -0,0 +1,200 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +CPU.Init >LDAXI MSG.CPU + jsr PrintCStrAX + + jsr Detect6502 A = CPU type + sta A2osX.CPUTYPE + lda MSG.CPUTYPEH,y + tax + lda MSG.CPUTYPEL,y + jsr PrintCStrAX + +CPU.Init.Speed lda MACHID + and #MACHID.TYPE + cmp #MACHID.TYPE.IIc + beq CPU.Init.Z80 + + >LDAXI MSG.CPU.SPEED + jsr PrintCStrAX + + stz A2osX.RANDOM16 + stz A2osX.RANDOM16+1 + + php + sei + +.1 bit VBL + bpl .2 + +.2 bit VBL + bmi .2 + + ldx #0 Count LO + lda #0 Count HI + +.3 ldy #3 (2) + +.4 nop (2) + dey (2) + bne .4 (2*) + + inc A2osX.RANDOM16 (6) + bne .5 (2*) + + inc A2osX.RANDOM16+1 (6) + bit VBL (4) + bpl .3 (2*) + bmi .6 + +.5 nop (2) + nop (2) + nop (2) + bit VBL (4) + bpl .3 (2*) + +.6 plp + + stz A2osX.CPUSPEED + +.7 sec + lda A2osX.RANDOM16 + sbc #100 + tax + lda A2osX.RANDOM16+1 + sbc /100 + bcc .8 + + stx A2osX.RANDOM16 + sta A2osX.RANDOM16+1 + inc A2osX.CPUSPEED + bra .7 + +.8 lda A2osX.RANDOM16 + sta A2osX.CPUSPEED+1 + pha push CPU speed LO + lda A2osX.CPUSPEED + pha push CPU speed HI + >LDAXI MSG.CPU.SPEEDOK + jsr PrintCStrAX + +CPU.Init.Z80 >LDAXI MSG.Z80 + jsr PrintCStrAX + jsr DetectZ80 + bcs .9 + sta A2osX.Z80SLOT + pha Push Z80Slot + + >LDAXI MSG.Z80.OK + jsr PrintCStrAX + rts + +.9 >LDAXI MSG.Z80.KO + jsr PrintCStrAX + rts +*-------------------------------------- +* Out: +* A = $60, 6502 +* A = $61, 65C02 +* A = $62, R65C02 +* A = $63, 65C816 +*-------------------------------------- +Detect6502 ldy #0 Test 6502 BCD bug + sed + lda #$99 + clc + adc #$01 + cld + bmi .9 BUG!, we have 6502 + + ldy #3 test 65C816 TYX Instruction + ldx #0 + .OP 65816 + tyx TYX: if 65C816, x becomes non-zero + .OP 65C02 + bne .9 worked! 65C816 + + dey y=2 -> R65C02 + ldx $EA save zp $EA + stz $EA store 0 in $EA +* .OP 65R02 + .HS F7EA For compatibility with A2osX.ASM +* smb 7,$EA if not Rockwell, assemble as nop nop +* .OP 65C02 + asl $EA cs if Rockwell + stx $EA restore zp $EA + bcs .9 + + dey y=1 -> 65C02 + +.9 tya + ora #$60 + rts +*-------------------------------------- +* Out: +* A = Z80 Slot +*-------------------------------------- +DetectZ80 ldx #Z80Code.Size +.1 lda Z80Code.Start-1,x + sta $1000-1,x 00000H for Z80 + dex + bne .1 + + stz ZPQuickPtr1 + lda #$C1 + sta ZPQuickPtr1+1 + +.2 sta (ZPQuickPtr1) + lda $100D + bmi .8 + inc ZPQuickPtr1+1 + lda ZPQuickPtr1+1 + cmp #$C8 + beq .9 CS + clc + adc #$20 + sta $100A + bra .2 + +.8 lda ZPQuickPtr1+1 + and #$0F + clc +.9 rts +*-------------------------------------- +Z80Code.Start .HS 31FFFF START: LD SP,0FFFFH Init Stack + .HS 3EFF LD A,0FFH Set Flag + .HS 320D00 LD (FLAG),A + .HS 3200E1 LD (0E100H),A Back to 6502 + .HS 18F3 JR START Loop + .HS 00 FLAG: .DB 0 +Z80Code.End .EQ * +Z80Code.Size .EQ Z80Code.End-Z80Code.Start +*-------------------------------------- +MSG.CPU >CSTRING "Checking CPU..." +MSG.CPU.SPEED >CSTRING "Detecting CPU Speed..." +MSG.CPUTYPEL .DA #MSG.6502 + .DA #MSG.65C02 + .DA #MSG.65R02 + .DA #MSG.65816 +MSG.CPUTYPEH .DA /MSG.6502 + .DA /MSG.65C02 + .DA /MSG.65R02 + .DA /MSG.65816 +MSG.6502 >CSTRING "6502.\n" +MSG.65C02 >CSTRING "65C02.\n" +MSG.65R02 >CSTRING "65R02.\n" +MSG.65816 >CSTRING "65816.\n" +MSG.CPU.SPEEDOK >CSTRING "%d.%02d Mhz.\n" +MSG.Z80 >CSTRING "Detecting Z80 CPU..." +MSG.Z80.OK >CSTRING "Detected In Slot %d.\n" +MSG.Z80.KO >CSTRING "Not Detected.\n" +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.CPU +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 761eb7d8..c7e4c262 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -5,25 +5,7 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -DevMgr.HiMem .EQ $FFFE Protect IRQ vector in Aux LC -*-------------------------------------- -* S.DevMgrInit -*-------------------------------------- -S.DevMgrInit ldx #S.DEV.SIZE*DevMgr.Count -.1 lda DevMgr.NUL-1,x - sta DevMgr.Table-1,x - dex - bne .1 - - stz DevMgr.Table+S.DEV.SIZE*DevMgr.Count+1 - - lda #DevMgr.Count-1 - sta DevMgr.LastDevID - - >LDYAI DevMgr.End - >STYA DevMgr.Free - clc - rts +DevMgr.HiMem .EQ $FFFA Protect IRQ vectors in Aux LC *-------------------------------------- * S.GetDevByIDA * IN: @@ -66,7 +48,6 @@ S.GetDevByIDA.T .BS 1 * X = DEVID * Y,A = pDev *-------------------------------------- -S.GetDevByNameA jsr S.GetMemPtrA S.GetDevByNameYA >STYA ZPQuickPtr1 >LDYAI DevMgr.Table+S.DEV.NAME @@ -126,36 +107,42 @@ DevMgr.SYS.BASL0 .EQ $800 *-------------------------------------- DevMgr.NUL cld jmp (DevMgr.NUL.Code,x) + .DA #0 DevID=0 .DA #S.DEV.F.INUSE+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR >PSTRING "NUL" NAME .HS 00 NAME must Be 5 bytes long - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- DevMgr.SYS cld jmp (DevMgr.SYS.Code,x) + .DA #1 DevID=1 .DA #S.DEV.F.INUSE+S.DEV.F.EVENT+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR >PSTRING "SYS" NAME .HS 00 NAME must Be 5 bytes long - .HS 00.00 + .HS 00 .HS 00.00.00.00 *-------------------------------------- -DevMgr.NUL.Code .DA .8 OPEN - .DA .8 GETEVENT +DevMgr.NUL.Code .DA DevMgr.Unsup OPEN + .DA DevMgr.Unsup GETEVENT .DA .8 COUT - .DA .8 CLOSE - .DA .8 GETINFO - .DA .8 IRQ + .DA DevMgr.Unsup CLOSE + .DA DevMgr.Unsup GETINFO + .DA DevMgr.Unsup IRQ + .DA DevMgr.Unsup SELECT .8 clc rts *-------------------------------------- DevMgr.SYS.Code .DA DevMgr.SYS.Open .DA DevMgr.SYS.GetEvent .DA DevMgr.SYS.COut - .DA .8 CLOSE - .DA .8 GETINFO - .DA .8 IRQ -.8 clc + .DA DevMgr.Unsup CLOSE + .DA DevMgr.Unsup GETINFO + .DA DevMgr.Unsup IRQ + .DA DevMgr.SYS.Select +*-------------------------------------- +DevMgr.Unsup lda #DEVMGR.ERRUNSUP + sec rts *-------------------------------------- DevMgr.SYS.Open stz DevMgr.SYS.CPULOADI @@ -180,28 +167,27 @@ DevMgr.SYS.Open stz DevMgr.SYS.CPULOADI jsr DevMgr.SYS.Home - lda A2osX.SCREENS - ora #A2osX.SCREENS.S - sta A2osX.SCREENS - lda #A2osX.SCREENS.S - jsr S.ScreenSelectA + lda #1 + sta A2osX.SCRNDEVS+1 + + jsr DevMgr.SYS.Select clc rts *-------------------------------------- DevMgr.SYS.GetEvent lda A2osX.ASCREEN - and #A2osX.SCREENS.S is screen active? - beq .9 + cmp #2 is SYS active? + bne .9 ldx DevMgr.SYS.CPULOADI lda DevMgr.SYS.CPULOADC,x sta DevMgr.SYS.BASL0+38 - dec DevMgr.SYS.CPULOADI + dex bpl .1 - lda #3 - sta DevMgr.SYS.CPULOADI + ldx #3 +.1 stx DevMgr.SYS.CPULOADI -.1 jsr S.GetKeyboardEvent + jsr S.GetKeyboardEvent bcs .9 rts @@ -239,6 +225,15 @@ DevMgr.SYS.COut phx clc rts *-------------------------------------- +DevMgr.SYS.Select + sta SETTEXT + sta SETALTCHAR + sta SET80DISP + sta CLR80STORE + sta SETPAGE2 + clc + rts +*-------------------------------------- DevMgr.SYS.FSOut lda DevMgr.SYS.CH cmp #79 diff --git a/SYS/KERNEL.S.DRV.txt b/SYS/KERNEL.S.DRV.txt index 07062575..a0ae9a3b 100644 --- a/SYS/KERNEL.S.DRV.txt +++ b/SYS/KERNEL.S.DRV.txt @@ -18,27 +18,28 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn bcc .1 rts -.1 sta LoadDrv.Cmd - stx LoadDrv.Args +.1 sta S.LoadDrv.Name + stx S.LoadDrv.Args >LDYAI ENV.DRV push ENVNAME=DRV jsr S.GetEnvVarYA get value for ENV=$DRV bcs .98 - sta LoadDrv.Path - >PUSHB LoadDrv.Cmd push CMD for S.FileSearch - >PUSHB LoadDrv.Path + sta S.LoadDrv.Srch + + >PUSHB S.LoadDrv.Name push CMD for S.FileSearch + >PUSHB S.LoadDrv.Srch jsr S.FileSearch find File in $DRV bcs .97 not Found - sta LoadDrv.FullName + sta S.LoadDrv.FullName jsr S.LoadBinA bcs .96 >STYA pDrv - stx LoadDrv.hMem + stx S.LoadDrv.hMem - lda LoadDrv.Args + lda S.LoadDrv.Args jsr S.LoadDrvA.Jmp call Dev.Detect bcs .95 @@ -56,24 +57,24 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn rts .95 pha - lda LoadDrv.hMem + lda S.LoadDrv.hMem jsr S.FreeMemA pla .96 pha - lda LoadDrv.FullName + lda S.LoadDrv.FullName jsr S.FreeMemA pla .97 pha - lda LoadDrv.Path + lda S.LoadDrv.Srch jsr S.FreeMemA pla .98 pha - lda LoadDrv.Args + lda S.LoadDrv.Args jsr S.FreeMemA - lda LoadDrv.Cmd + lda S.LoadDrv.Name jsr S.FreeMemA pla @@ -82,11 +83,11 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn *-------------------------------------- S.LoadDrvA.Jmp jmp (pDrv) *-------------------------------------- -LoadDrv.Cmd .BS 1 -LoadDrv.Args .BS 1 -LoadDrv.Path .BS 1 -LoadDrv.FullName .BS 1 -LoadDrv.hMem .BS 1 +S.LoadDrv.Name .BS 1 +S.LoadDrv.Args .BS 1 +S.LoadDrv.Srch .BS 1 +S.LoadDrv.FullName .BS 1 +S.LoadDrv.hMem .BS 1 *-------------------------------------- * pDrv = .DRV File Loaded Address *-------------------------------------- @@ -231,6 +232,10 @@ S.InsDrv.Move ldy #H.BIN.DEV.HEADER.O dey bpl .1 + lda DevMgr.LastDevID Save Dev.ID in the driver for SELECT + ldy #S.DEV.ID + sta (pDev),y + ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc @@ -270,6 +275,7 @@ S.InsDrv.Move ldy #H.BIN.DEV.HEADER.O bra .2 .8 rts *-------------------------------------- +ENV.DRV >PSTRING "DRV" S.InsDrv.DrvLen .BS 2 S.InsDrv.DrvEnd .BS 2 *-------------------------------------- diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 8cd4e6f5..7dd6f9f3 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -140,64 +140,42 @@ S.ExpandPStrA.VC S.ExpandPStrA.Start .BS 1 S.ExpandPStrA.End .BS 1 *-------------------------------------- -* S.CreateEnv -* in : -* out : -* A = hMem to new env -*-------------------------------------- -S.CreateEnv >PUSHWI K.ENV.SIZE get a buffer for ENV - >PUSHBI 0 - jsr S.GetMem create it... - bcs .9 - >STYA ZPQuickPtr1 - lda #0 - sta (ZPQuickPtr1) - txa - clc -.9 rts -*-------------------------------------- * S.DupEnvA * In: * A = ENV hMem To Duplicate * Out: * A = hMem to new ENV *-------------------------------------- -S.DupEnvA pha - jsr S.GetMemPtrA +S.DupEnvA jsr S.GetMemPtrA >STYA ZPQuickPtr1 - pla >PUSHWI K.ENV.SIZE >PUSHBI 0 jsr S.GetMem bcs .9 >STYA ZPQuickPtr2 - phx -.1 lda (ZPQuickPtr1) - sta (ZPQuickPtr2) + + ldy #0 + +.1 lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y beq .8 - inc ZPQuickPtr1 - bne .2 - inc ZPQuickPtr1+1 -.2 inc ZPQuickPtr2 + + iny bne .1 + inc ZPQuickPtr1+1 inc ZPQuickPtr2+1 bra .1 -.8 pla + +.8 txa clc .9 rts *-------------------------------------- -* S.GetEnvVarA -* In: -* A = hMem to NAME (PSTRING) -*-------------------------------------- * S.GetEnvVarYA * In: * Y,A = PTR to NAME (PSTRING) * Out: * A = hMem to VALUE (PSTRING) 0,"" if not exist *-------------------------------------- -S.GetEnvVarA >PULLA - jsr S.GetMemPtrA S.GetEnvVarYA >STYA ZPQuickPtr2 jsr S.FindVar bcc .1 @@ -212,6 +190,7 @@ S.GetEnvVarYA >STYA ZPQuickPtr2 txa clc rts + .1 lda (ZPQuickPtr1) get NAME=VALUE len sec sbc (ZPQuickPtr2) substract (NAME len) @@ -345,6 +324,14 @@ S.SetEnvVar >STYA ZPQuickPtr3 ZPQuickPtr3 = VALUE sec rts *-------------------------------------- +* S.PutEnvYA +* In: +* Y,A = PTR To Name (NAME=VALUE) +* Out: +*-------------------------------------- +S.PutEnvYA clc + rts +*-------------------------------------- * S.DelEnvVarA * In: * PULLB = hMem To Name (PSTRING) diff --git a/SYS/KERNEL.S.EVT.txt b/SYS/KERNEL.S.EVT.txt index 713c72ec..159d0d3a 100644 --- a/SYS/KERNEL.S.EVT.txt +++ b/SYS/KERNEL.S.EVT.txt @@ -5,27 +5,6 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* S.EvtMgrInit -*-------------------------------------- -S.EvtMgrInit lda #10 - sta EVTMGR.10TH.CNT - - lda A2osX.HZ - sta EVTMGR.HZ.CNT - - lda MACHID - and #MACHID.TYPE - cmp #MACHID.TYPE.IIc - bne .8 - -* sta CLRIOUDIS -* sta ENBVBLIIC - -.8 lda /EvtMgr.Table - sta pEvent+1 - clc - rts -*-------------------------------------- * GETEVENT : * IN : * OUT : diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index 8557c9ca..a2424224 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -47,14 +47,16 @@ S.FileSearch >PULLA Get Search path rts .10 sta S.FileSearch.hSrch Store Expanded path list to search - + >PULLB S.FileSearch.hFile Store Filename + lda #1 sta S.FileSearch.Idx Start At Token 1 .1 >PUSHB S.FileSearch.hSrch push expanded path list - >PUSHBI $3B Push SEP=';' + >PUSHBI ';' >PUSHB S.FileSearch.Idx Push Token IDX + jsr S.PStrGetTkn Get token in A bcs .98 @@ -66,7 +68,8 @@ S.FileSearch >PULLA Get Search path sta S.FileSearch.hFull Store Full path (Token Path+filename) - jsr S.MLIGetFileInfoA + jsr S.GetMemPtrA + jsr S.MLIGetFileInfoYA bcc .8 lda S.FileSearch.hFull Discard this Full Path @@ -99,14 +102,13 @@ S.FileSearch.Idx .BS 1 S.FileSearch.hPath .BS 1 S.FileSearch.hFull .BS 1 *-------------------------------------- -* S.LoadFileA +* S.LoadFileYA * in : -* A = hMem of FilePath (PSTRING) +* Y,A = FilePath (PSTRING) * out : * Y,A = File Length * X = hMem of Loaded File *-------------------------------------- -S.LoadFileA jsr S.GetMemPtrA S.LoadFileYA jsr S.ExpandPStrYA sta S.LoadFile.hExp jsr S.GetMemPtrA diff --git a/SYS/KERNEL.S.GP.txt b/SYS/KERNEL.S.GP.txt new file mode 100644 index 00000000..ce93af4f --- /dev/null +++ b/SYS/KERNEL.S.GP.txt @@ -0,0 +1,141 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* A2osX.SYSCALL (AUXLC to AUXLC) +* In: +* X = SYSfnc.Index +* Y,A = free for Inline param +*-------------------------------------- +A2osX.GP.Start jmp (KERNEL.SYSCALL,x) +*-------------------------------------- +* LIBCALL (AUXLC to AUXLC) +* In: +* Y = LIB.ID +* X = LIBfnc.Index +* A = free for Inline param +*-------------------------------------- + jmp A2osX.LIBCALL1 +*-------------------------------------- +* Kernel.MLICALL (AUXLC to MAINLC) +* In: +* X = MLI Function +* A = Param Count +*-------------------------------------- + jmp A2osX.MLICALL1 +*-------------------------------------- + jmp A2osX.ROMCALL1 +*-------------------------------------- + jmp BrkHandler + .BS $BE10-* +*-------------------------------------- + jmp (pDev) pDevJmp + jmp (pCode) pCodeJmp + jmp (pLib) pLibJmp + .BS $BE20-* +*-------------------------------------- +GO.Reset jsr GO.AUXLC + jmp S.KernelRun +*-------------------------------------- +A2osX.LIBCALL1 pha + phx + tya + >SYSCALL SYS.GetMemPtrA + >STYA .1+1 + plx + pla +.1 jmp $FFFF +*-------------------------------------- +A2osX.MLICALL1 jsr GO.MAINLC + stx .1 + sta MLICALL.PARAMS + jsr MLI +.1 .BS 1 + .DA MLICALL.PARAMS + jsr GO.AUXLC + rts +*-------------------------------------- +A2osX.ROMCALL1 plx + stx .1+1 + plx + stx .1+2 + ldx RROMBNK1 + jsr .1 + ldx RRAMWRAMBNK1 + ldx RRAMWRAMBNK1 + rts +.1 jmp $FFFF +*-------------------------------------- +GO.MAINLC php + clc + .HS 2C bit abs + +GO.AUXLC php + sec + sei + + sta A2osX.SaveA + pla keep P in A for later + stx A2osX.SaveX + sty A2osX.SaveY + plx + ply + inx + bne .1 + iny +.1 stx GO.EXIT.JMP+1 + sty GO.EXIT.JMP+2 + + ldx RRAMWRAMBNK1 + ldx RRAMWRAMBNK1 + + ldy pStack + bcs GO.AUXLC1 + +GO.MAINLC1 tsx + stx A2osX.SaveSX + ldx A2osX.SaveSM + txs + stx CLRALTZP + bra GO.EXIT +*-------------------------------------- +GO.AUXLC1 stx SETALTZP + tsx + stx A2osX.SaveSM + ldx A2osX.SaveSX + txs +*-------------------------------------- +GO.EXIT sty pStack + pha push P on stack + ldy A2osX.SaveY + ldx A2osX.SaveX + lda A2osX.SaveA + plp +GO.EXIT.JMP jmp $FFFF +*-------------------------------------- +A2osX.SaveA .BS 1 +A2osX.SaveX .BS 1 +A2osX.SaveY .BS 1 +*-------------------------------------- +BrkHandler sta SETPAGE2 + bra * +*-------------------------------------- +IrqHandler bra * +*-------------------------------------- +A2osX.GP.End .EQ * +*-------------------------------------- +* CONTROL SECTION : +*-------------------------------------- + .DO A2osX.GP.End>$BEBF + ERROR:GP too big + .FIN +*-------------------------------------- + .BS A2osX.GP.START+$100-* +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.GP +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.INIT.txt b/SYS/KERNEL.S.INIT.txt new file mode 100644 index 00000000..7fcaa848 --- /dev/null +++ b/SYS/KERNEL.S.INIT.txt @@ -0,0 +1,190 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* Setup MainLC ($3FE) +* +* +* Setup AuxLC $FFFE->Kernel IRQ Handler +* if irq not handled, jmp (S.IrqMgrOldFFFE) +*-------------------------------------- +S.IrqMgrInit php + sei + >LDYA $FFFE + cpy #S.IrqHandlerAuxLC + bne .1 + cmp /S.IrqHandlerAuxLC + beq .2 + +.1 >STYA S.IrqMgrOldFFFE + >LDYAI S.IrqHandlerAuxLC + >STYA $FFFE + +.2 + +* >LDYAI $BE0C +* >STYA $3F0 + + plp + clc + rts +*-------------------------------------- +S.MemMgrInit >LDYAI MemMgr.MHiMem + >STYA MemMgr.HiMem + >STYA MemMgr.Free + >LDYAI MemMgr.MLoMem + >STYA MemMgr.LoMem + stz MemMgr.LastSlot Reserve Slot #0 + + sta SETWRITEAUX + + >LDYAI MemMgr.XHiMem + >STYA MemMgr.HiMem + >STYA MemMgr.Free + >LDYAI MemMgr.XLoMem + >STYA MemMgr.LoMem + stz MemMgr.LastSlot Reserve Slot #0 + + sta CLRWRITEAUX + + clc + rts +*-------------------------------------- +* S.DevMgrInit +*-------------------------------------- +S.DevMgrInit ldx #S.DEV.SIZE*DevMgr.Count +.1 lda DevMgr.NUL-1,x + sta DevMgr.Table-1,x + dex + bne .1 + + stz DevMgr.Table+S.DEV.SIZE*DevMgr.Count+1 + + lda #DevMgr.Count-1 + sta DevMgr.LastDevID + + >LDYAI DevMgr.End + >STYA DevMgr.Free + clc + rts +*-------------------------------------- +* S.EvtMgrInit +*-------------------------------------- +S.EvtMgrInit lda #10 + sta EVTMGR.10TH.CNT + + lda A2osX.HZ + sta EVTMGR.HZ.CNT + + lda MACHID + and #MACHID.TYPE + cmp #MACHID.TYPE.IIc + bne .8 + +* sta CLRIOUDIS +* sta ENBVBLIIC + +.8 lda /EvtMgr.Table + sta pEvent+1 + clc + rts +*-------------------------------------- +* S.TskMgrInit +*-------------------------------------- +S.TskMgrInit stz TSKMGR.LASTID + lda #1 + sta TSKMGR.SIZE One Slot Busy (Kernel PS=0) + + >LDYAI TskMgr.Table Clear whole process table + >STYA pPs + + ldx #K.PS.MAX + +.1 lda #0 + ldy #S.PS.SIZE-1 + +.2 sta (pPs),y + dey + bpl .2 + + lda pPs + clc + adc #S.PS.SIZE + sta pPs + bcc .3 + + inc pPs+1 +.3 dex + bne .1 + + >LDYAI TskMgr.Table Select Process 0 (Kernel) + >STYA pPs + + lda #1 + ldy #S.PS.hINDEV + sta (pPs),y Make In DEV = SYS + ldy #S.PS.hOUTDEV + sta (pPs),y Make OUT DEV = SYS + ldy #S.PS.hERRDEV + sta (pPs),y Make ERR DEV = SYS + + >SYSCALL SYS.GetDevByIDA + >STYA pDev + ldx #DEVMGR.OPEN + jsr pDevJmp + + >PUSHWI K.ENV.SIZE get a buffer for ENV + >PUSHBI S.MEM.F.INIT0 make sure blank + >SYSCALL SYS.GetMem create it... + bcs * + + txa + ldy #S.PS.hENV + sta (pPs),y + + >LDYAI TmpBuffer256 + >SYSCALL SYS.MLIGetPrefixYA + bcs * + + >LDYAI TmpBuffer256 + >SYSCALL SYS.NewPStrYA + bcs * + + ldy #S.PS.hPREFIX + sta (pPs),y + + >PUSHWI TmpBuffer256 push ENV value + >PUSHWI I.ENV.A2osX push ENV name + >SYSCALL SYS.SetEnvVarP + bcs .9 + + >PUSHWI I.ENV.PATH.VAL + >PUSHWI I.ENV.PATH + >SYSCALL SYS.SetEnvVarP + bcs .9 + + >PUSHWI I.ENV.LIB.VAL + >PUSHWI I.ENV.LIB + >SYSCALL SYS.SetEnvVarP + bcs .9 + + >PUSHWI I.ENV.DRV.VAL + >PUSHWI I.ENV.DRV + >SYSCALL SYS.SetEnvVarP +.9 rts +*-------------------------------------- +I.ENV.A2osX >PSTRING "A2OSX" +I.ENV.PATH >PSTRING "PATH" +I.ENV.PATH.VAL >PSTRING "${A2OSX}SBIN/;${A2OSX}BIN/" +I.ENV.LIB >PSTRING "LIB" +I.ENV.LIB.VAL >PSTRING "${A2OSX}LIB/" +I.ENV.DRV >PSTRING "DRV" +I.ENV.DRV.VAL >PSTRING "${A2OSX}DRV/" +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.INIT +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.IRQ.txt b/SYS/KERNEL.S.IRQ.txt index 81d3a26a..f4e768e6 100644 --- a/SYS/KERNEL.S.IRQ.txt +++ b/SYS/KERNEL.S.IRQ.txt @@ -5,41 +5,6 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* Setup MainLC ($3FE) -* -* -* Setup AuxLC $FFFE->Kernel IRQ Handler -* if irq not handled, jmp (S.IrqMgrOldFFFE) -*-------------------------------------- -S.IrqMgrInit php - sei - >LDYA $FFFE - cpy #S.IrqHandlerAuxLC - bne .1 - cmp /S.IrqHandlerAuxLC - beq .2 - -.1 >STYA S.IrqMgrOldFFFE - >LDYAI S.IrqHandlerAuxLC - >STYA $FFFE - -.2 - -* >LDYAI $BE0C -* >STYA $3F0 - - plp - clc - rts -*-------------------------------------- -S.IrqMgrQuit php - sei - >LDYA S.IrqMgrOldFFFE - >STYA $FFFE - plp - cli -.8 rts -*-------------------------------------- S.BrkHandlerAuxLC bra * *-------------------------------------- diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt new file mode 100644 index 00000000..d12b1026 --- /dev/null +++ b/SYS/KERNEL.S.JMP.txt @@ -0,0 +1,157 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* $E000-E0FF KERNEL.SYSCALL Jmp Table +*-------------------------------------- + .DA S.GetMem $00 + .DA S.FreeMemA + .DA S.GetMemPtrA + .DA S.GetMemByIDA + .DA S.GetMemByNameYA + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.NewPStrYA $10 + .DA S.PStrCpyA + .DA S.PStrCat + .DA S.PStrCmp + .DA S.PStrGetTkn + .DA 0 + .DA S.GetArgCount + .DA S.GetArgA +*-------------------------------------- + .DA 0 $20 + .DA S.LoadLibYA + .DA S.UnloadLibA + .DA S.LoadDrvA + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.ExpandPStrA $30 + .DA S.ExpandPStrYA + .DA S.PutEnvYA + .DA S.GetEnvVarYA + .DA S.SetEnvVarH + .DA S.SetEnvVarP + .DA S.DelEnvVarA + .DA S.DelEnvVarYA +*-------------------------------------- + .DA S.MLICreateFile $40 + .DA 0 + .DA S.MLICreateDirYA + .DA 0 + .DA S.MLIDestroyYA + .DA S.MLIRename + .DA S.MLISetFileInfo + .DA 0 +*-------------------------------------- + .DA S.MLIGetFileInfoYA $50 + .DA S.MLIOnline + .DA 0 + .DA S.MLISetPrefixYA + .DA 0 + .DA S.MLIGetPrefixYA + .DA 0 + .DA S.MLIOpenYA +*-------------------------------------- + .DA S.MLINewLine $60 + .DA S.MLIRead + .DA S.MLIWrite + .DA S.MLICloseA + .DA S.MLIFlushA + .DA S.MLISetMark + .DA S.MLIGetMarkA + .DA S.MLISetEOF +*-------------------------------------- + .DA S.MLIGetEOFA $70 + .DA S.MLISetBuf + .DA S.MLIGetBuf + .DA S.MLIGetTime + .DA S.MLIAllocIRQ + .DA S.MLIDeallocIRQA + .DA S.MLIReadBlock + .DA S.MLIWriteBlock +*-------------------------------------- + .DA S.GetDevByIDA $80 + .DA 0 + .DA S.GetDevByNameYA + .DA S.GetDevInfoA + .DA S.GetKeyboardEvent + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.ExecProcessNewEnvYA $90 + .DA S.ExecProcessYA + .DA S.CreateProcessNewEnvYA + .DA S.CreateProcessYA + .DA S.GetPSByIDA + .DA 0 + .DA S.Sleep + .DA 0 +*-------------------------------------- + .DA S.CheckPrefixA $A0 + .DA S.FileSearch + .DA 0 + .DA S.LoadFileYA + .DA S.ListDirInitA + .DA S.ListDirInitYA + .DA S.ListDirNextA + .DA S.ListDirCloseA +*-------------------------------------- + .DA 0 $B0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA 0 $C0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.COutA $D0 + .DA 0 + .DA S.PSTROutYA + .DA 0 + .DA S.HexOutA + .DA S.HexOutYA + .DA S.DecOutA + .DA S.DecOutYA +*-------------------------------------- + .DA 0 $E0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA 0 $F0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.JMP +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.LIB.txt b/SYS/KERNEL.S.LIB.txt index c15665f8..56c80aa2 100644 --- a/SYS/KERNEL.S.LIB.txt +++ b/SYS/KERNEL.S.LIB.txt @@ -33,7 +33,8 @@ S.LoadLibYA.hLibName .BS 1 * out : * A = hMem of Loaded Lib *-------------------------------------- -S.LoadLibA sta S.LoadLibA.hName push libname for S.FileSearch +S.LoadLibA sta S.LoadLibA.hName save libname for S.FileSearch + >LDYAI ENV.LIB push ENVNAME=LIB jsr S.GetEnvVarYA get value for ENV=LIB bcs .99 @@ -62,11 +63,15 @@ S.LoadLibA sta S.LoadLibA.hName push libname for S.FileSearch clc rts -.97 lda S.LoadLibA.hPath discard LIB PATH +.97 pha + lda S.LoadLibA.hPath discard LIB PATH jsr S.FreeMemA + pla -.98 lda S.LoadLibA.hSrch discard LIB VALUE +.98 pha + lda S.LoadLibA.hSrch discard LIB VALUE jsr S.FreeMemA + pla sec .99 rts *-------------------------------------- @@ -105,6 +110,7 @@ S.UnloadLibA pha pla jmp S.FreeMemA *-------------------------------------- +ENV.LIB >PSTRING "LIB" MAN SAVE SYS/KERNEL.S.LIB LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index 44ba20db..36a505ff 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -19,33 +19,6 @@ ZPMemMgrTmp3 .EQ ZPMemMgr+6 * Garbage collector move blocks * - mem.ID=0 always used! useful to test if hMem=0 *-------------------------------------- -S.MemMgrInit >LDYAI MemMgr.MHiMem - >STYA MemMgr.HiMem - >STYA MemMgr.Free - - >LDYAI MemMgr.MLoMem - >STYA MemMgr.LoMem - - stz MemMgr.LastSlot Reserve Slot #0 - - sta SETREADAUX - sta SETWRITEAUX - - >LDYAI MemMgr.XHiMem - >STYA MemMgr.HiMem - >STYA MemMgr.Free - - >LDYAI MemMgr.XLoMem - >STYA MemMgr.LoMem - - stz MemMgr.LastSlot Reserve Slot #0 - - sta CLRREADAUX - sta CLRWRITEAUX - - clc - rts -*-------------------------------------- * PUBLIC *-------------------------------------- * S.GetMem @@ -373,13 +346,11 @@ S.GetMemByIDA stz ZPMemMgrSPtr+1 rts *-------------------------------------- * In: -* A = hMem to BINPATH (PSTR) +* Y,A = BINPATH (PSTR) * Out: * Y,A = ZPMemMgrSPtr = PTR to S.MEM * X = hMem *-------------------------------------- -S.GetMemByNameA jsr S.GetMemPtrA - bcs * S.GetMemByNameYA >STYA ZPMemMgrTmp1 save BINPATH >LDYAI MemMgr.Table diff --git a/SYS/KERNEL.S.MLI.txt b/SYS/KERNEL.S.MLI.txt index e5573752..6ed8cd35 100644 --- a/SYS/KERNEL.S.MLI.txt +++ b/SYS/KERNEL.S.MLI.txt @@ -14,7 +14,6 @@ S.MLICreateFile >PULLW MLICALL.PARAMS+1 lda #$01 Storage=Standard Files bra S.MLICreate *-------------------------------------- -S.MLICreateDirA jsr S.GetMemPtrA S.MLICreateDirYA >STYA MLICALL.PARAMS+1 lda #$C3 @@ -26,7 +25,6 @@ S.MLICreate sta MLICALL.PARAMS+7 >MLICALL MLICREATE rts *-------------------------------------- -S.MLIDestroyA jsr S.GetMemPtrA S.MLIDestroyYA >STYA MLICALL.PARAMS+1 >MLICALL MLIDESTROY rts @@ -49,14 +47,12 @@ S.MLISetFileInfo >MLICALL MLISETFILEINFO rts *-------------------------------------- -* S.MLIGetFileInfoA +* S.MLIGetFileInfoYA * in : -* A = hMem To FileName +* Y,A = FileName * out : * Y,A = PTR To Buffer (L=15) *-------------------------------------- -S.MLIGetFileInfoA - jsr S.GetMemPtrA S.MLIGetFileInfoYA >STYA MLICALL.PARAMS+1 >MLICALL MLIGETFILEINFO @@ -74,26 +70,23 @@ S.MLIOnline >PULLB MLICALL.PARAMS+1 >MLICALL MLIONLINE rts *-------------------------------------- -S.MLISetPrefixA jsr S.GetMemPtrA S.MLISetPrefixYA >STYA MLICALL.PARAMS+1 >MLICALL MLISETPREFIX rts *-------------------------------------- -S.MLIGetPrefixA jsr S.GetMemPtrA S.MLIGetPrefixYA >STYA MLICALL.PARAMS+1 >MLICALL MLIGETPREFIX rts *-------------------------------------- -* S.MLIOpenA +* S.MLIOpenYA * in : -* A = hMem To FileName +* YA = FileName * out : * A = ref_num * X = buf hMem *-------------------------------------- -S.MLIOpenA jsr S.GetMemPtrA S.MLIOpenYA >STYA MLICALL.PARAMS+1 >PUSHWI 1024 get a ProDOS IO buffer >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE diff --git a/SYS/KERNEL.S.RUN.txt b/SYS/KERNEL.S.RUN.txt new file mode 100644 index 00000000..0a822169 --- /dev/null +++ b/SYS/KERNEL.S.RUN.txt @@ -0,0 +1,107 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +S.KernelRun jsr S.TskMgrRun + bcc S.KernelRun.EVT + jsr DevMgr.SYS.Select + >LDYAI MSG.KRNLPANIC + jsr S.PSTROutYA + bra * + +S.KernelRun.EVT + jsr S.GetEvents + bcs S.KernelRun CS=no event + + jsr S.DispatchEvents + bcc S.KernelRun CC=All Events Dispatched + + jsr S.SelectProcess0 + + stz pEvent + +.1 lda (pEvent) + beq .81 + bmi .8 Discard any timer event + + bit #S.EVT.F.KEY any special key? + beq .7 + + ldy #S.EVT.DATAHI Open-Apple? + lda (pEvent),y + bpl .7 + + ldy #S.EVT.DATALO + lda (pEvent),y + + cmp #'1' + bcc .8 + cmp #'5' + bcs .8 + and #$0F + + cmp A2osX.ASCREEN + beq .8 + + tax + lda A2osX.SCRNDEVS-1,x + beq .8 + + jsr S.GetDevByIDA + bcs .8 + + >STYA pDev + ldx #DEVMGR.SELECT + jsr pDevJmp + bcs .8 + + ldy #S.EVT.DATALO + lda (pEvent),y + and #$0F + sta A2osX.ASCREEN + bra .8 + +.7 jsr S.DumpEvent + +.8 jsr S.DestroyEvent + +.81 lda pEvent + clc + adc #S.EVT + sta pEvent + lda EVTMGR.COUNT + bne .1 + jmp S.KernelRun +*-------------------------------------- +S.DumpEvent ldy #S.EVT.DATAW2+1 + >PUSHB (pEvent),y + dey + >PUSHB (pEvent),y + + ldy #S.EVT.DATAW1+1 + >PUSHB (pEvent),y + dey + >PUSHB (pEvent),y + + ldy #S.EVT.DATAHI + >PUSHB (pEvent),y + ldy #S.EVT.DATALO + >PUSHB (pEvent),y + + ldy #S.EVT.hDEV + >PUSHB (pEvent),y + + >PUSHB (pEvent) + >LDYAI MSG.DumpEvent + jmp S.PSTROutYA +*-------------------------------------- +MSG.DumpEvent >PSTRING "!Unhandled Event:Flags=%h,DevID=%h,DATALO=%h,DATAHI=%h,W1=%H,W2=%H\n" +MSG.KRNLPANIC >PSTRING "\n!!!Kernel Panic!!!\n" +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.RUN +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index 124a4d20..dd14aa8d 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -214,49 +214,51 @@ S.PStrMatch1 lda (ZPQuickPTR1) Keep Pattern Length in X * X = hMem to Remaining String After Token "Split Mode" *-------------------------------------- S.PStrGetTkn >PULLA Get IDX - sta ZPQuickPtr2+1 + sta S.PStrGetTkn.IDX >PULLA Get SEP - sta ZPQuickPtr2 + sta S.PStrGetTkn.SEP >PULLA Get PStr jsr S.GetMemPtrA >STYA ZPQuickPtr1 - ldx #0 init token count to 0 + +S.PStrGetTkn1 ldx #0 init token count to 0 ldy #0 - stz ZPQuickPtr3 init INTOKEN start to 0 + stz S.PStrGetTkn.START init INTOKEN start to 0 .1 iny lda (ZPQuickPtr1),y and #$7F - cmp ZPQuickPtr2 char=SEP ? + cmp S.PStrGetTkn.SEP char=SEP ? bne .3 no, start a new token if not alredy in - lda ZPQuickPtr3 SEP:in INTOKEN ? + lda S.PStrGetTkn.START SEP:in INTOKEN ? beq .4 no, skip this SEP inx yes, increase token count - lda ZPQuickPtr2+1 requested token=0 ? + lda S.PStrGetTkn.IDX requested token=0 ? beq .71 yes, we are in "split mode" - cpx ZPQuickPtr2+1 no,is current X=requested IDX? + cpx S.PStrGetTkn.IDX no,is current X=requested IDX? beq .71 - stz ZPQuickPtr3 reset in INTOKEN start + stz S.PStrGetTkn.START reset in INTOKEN start bra .4 -.3 lda ZPQuickPtr3 char:already INTOKEN ? +.3 lda S.PStrGetTkn.START char:already INTOKEN ? bne .4 yes, keep existing start index - sty ZPQuickPtr3 mark begining of token + sty S.PStrGetTkn.START mark begining of token .4 tya cmp (ZPQuickPtr1) end of string ? bne .1 no, get next one - lda ZPQuickPtr3 INTOKEN? + lda S.PStrGetTkn.START INTOKEN? beq .6 inx yes, last one is ending with string -.6 lda ZPQuickPtr2+1 split mode ? +.6 lda S.PStrGetTkn.IDX split mode ? beq .7 - cpx ZPQuickPtr2+1 is token = requested? + cpx S.PStrGetTkn.IDX is token = requested? beq .7 sec End of String reached, no matching token .61 rts + .71 dey move back yo end of token before this SEP -.7 sty ZPQuickPtr3+1 we have matching token (or 1st one in split mode) at [ZPQuickPtr3,ZPQuickPtr3+1] - tya compute token len=Y-ZPQuickPtr3+1 +.7 sty S.PStrGetTkn.END we have matching token (or 1st one in split mode) at [START,END] + tya compute token len=Y-END sec - sbc ZPQuickPtr3 + sbc S.PStrGetTkn.START inc +1 inc +1 for string len tay @@ -266,39 +268,39 @@ S.PStrGetTkn >PULLA Get IDX jsr S.GetMem bcs .61 phx save hMem - >STYA ZPQuickPtr4 - lda ZPQuickPtr3+1 + >STYA ZPQuickPtr2 + lda S.PStrGetTkn.END sec - sbc ZPQuickPtr3 + sbc S.PStrGetTkn.START inc - sta (ZPQuickPtr4) set this string length - ldy ZPQuickPtr3 + sta (ZPQuickPtr2) set this string length + ldy S.PStrGetTkn.START dey .8 iny - inc ZPQuickPtr4 + inc ZPQuickPtr2 bne .9 - inc ZPQuickPtr4+1 + inc ZPQuickPtr2+1 .9 lda (ZPQuickPtr1),y - sta (ZPQuickPtr4) - cpy ZPQuickPtr3+1 + sta (ZPQuickPtr2) + cpy S.PStrGetTkn.END bne .8 - lda ZPQuickPtr2+1 requested token=0 ? + lda S.PStrGetTkn.IDX requested token=0 ? bne .87 tya yes, we are in "split mode" cmp (ZPQuickPtr1) Remaining chars ? beq .87 .10 iny move to next char lda (ZPQuickPtr1),y - cmp ZPQuickPtr2 char=SEP? + cmp S.PStrGetTkn.SEP char=SEP? bne .11 tya cmp (ZPQuickPtr1) last one ? bne .10 bra .87 yes, nothing to return -.11 sty ZPQuickPtr3+1 ZPQuickPtr3+1=1st non SEP char - lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr3+1 +.11 sty S.PStrGetTkn.END S.PStrGetTkn.END=1st non SEP char + lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr1+1 sec - sbc ZPQuickPtr3+1 + sbc S.PStrGetTkn.END inc inc +1 for string len tay @@ -308,20 +310,20 @@ S.PStrGetTkn >PULLA Get IDX jsr S.GetMem bcs .98 phx save hMem - >STYA ZPQuickPtr4 + >STYA ZPQuickPtr2 lda (ZPQuickPtr1) sec - sbc ZPQuickPtr3+1 + sbcS.PStrGetTkn.END inc - sta (ZPQuickPtr4) - ldy ZPQuickPtr3+1 + sta (ZPQuickPtr2) + ldy S.PStrGetTkn.END dey .12 iny - inc ZPQuickPtr4 + inc ZPQuickPtr2 bne .13 - inc ZPQuickPtr4+1 + inc ZPQuickPtr2+1 .13 lda (ZPQuickPtr1),y - sta (ZPQuickPtr4) + sta (ZPQuickPtr2) tya cmp (ZPQuickPtr1) bne .12 @@ -329,15 +331,22 @@ S.PStrGetTkn >PULLA Get IDX pla get back token hMem clc rts + .87 ldx #0 Splitmode but no remaining string to return pla get back token hMem clc rts + .98 pla get back Token hMem jsr S.FreeMemA discard Token .99 sec rts *-------------------------------------- +S.PStrGetTkn.SEP .BS 1 +S.PStrGetTkn.IDX .BS 1 +S.PStrGetTkn.START .BS 1 +S.PStrGetTkn.END .BS 1 +*-------------------------------------- S.GetArgCount clc rts diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt index bdf7a98f..034b58c4 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -5,87 +5,6 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* S.TskMgrInit -*-------------------------------------- -S.TskMgrInit stz TSKMGR.LASTID - lda #1 - sta TSKMGR.SIZE One Slot Busy (Kernel PS=0) - - >LDYAI TskMgr.Table Clear whole process table - >STYA ZPQuickPtr1 - - ldx #K.PS.MAX - -.1 lda #0 - ldy #S.PS.SIZE-1 - -.2 sta (ZPQuickPtr1),y - dey - bpl .2 - - lda ZPQuickPtr1 - clc - adc #S.PS.SIZE - sta ZPQuickPtr1 - bcc .3 - - inc ZPQuickPtr1+1 -.3 dex - bne .1 - - lda #1 - ldy #S.PS.hINDEV - sta TskMgr.Table,y Make In DEV = SYS - ldy #S.PS.hOUTDEV - sta TskMgr.Table,y Make OUT DEV = SYS - ldy #S.PS.hERRDEV - sta TskMgr.Table,y Make ERR DEV = SYS - - jsr S.CreateEnv - bcs * - - ldy #S.PS.hENV - sta TskMgr.Table,y - - >LDYAI TmpBuffer256 - jsr S.MLIGetPrefixYA - bcs * - - >LDYAI TmpBuffer256 - jsr S.NewPStrYA - bcs * - - ldy #S.PS.hPREFIX - sta TskMgr.Table,y -S.TskMgrInit.Env - - jsr S.SelectProcess0 - - ldx #DEVMGR.OPEN - jsr pDevJmp - - >PUSHWI TmpBuffer256 push ENV value - >PUSHWI ENV.A2osX push ENV name - jsr S.SetEnvVarP - bcs .9 - - >PUSHWI ENV.PATH.VALUE - >PUSHWI ENV.PATH - jsr S.SetEnvVarP - bcs .9 - - >PUSHWI ENV.LIB.VALUE - >PUSHWI ENV.LIB - jsr S.SetEnvVarP - bcs .9 - - >PUSHWI ENV.DRV.VALUE - >PUSHWI ENV.DRV - jsr S.SetEnvVarP - bcs .9 - -.9 rts -*-------------------------------------- * S.TskMgrRun *-------------------------------------- S.TskMgrRun >LDYAI TskMgr.Table+S.PS.SIZE diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 177d3eed..32068cd4 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -5,7 +5,7 @@ INC 1 AUTO 6 .LIST OFF .OP 65C02 - .OR $D000 + .OR $2000 .TF /A2OSX.BOOT/SYS/KERNEL *-------------------------------------- .INB INC/MACROS.I @@ -13,183 +13,99 @@ AUTO 6 .INB INC/IO.I .INB INC/PRODOS.I *-------------------------------------- +TmpPtr1 .EQ $0 for X.PRINTF.S ZPQuickPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope ZPQuickPtr2 .EQ ZPKERNEL+2 (could be trashed by any JSR) ZPQuickPtr3 .EQ ZPKERNEL+4 ZPQuickPtr4 .EQ ZPKERNEL+6 *-------------------------------------- -* $D000-D0FF KERNEL.SYSCALL Jmp Table +* Kernel Stage 2 *-------------------------------------- - .DA S.GetMem $00 - .DA S.FreeMemA - .DA S.GetMemPtrA - .DA S.GetMemByIDA - - .DA S.GetMemByNameA - .DA S.GetMemByNameYA - .DA 0 - .DA 0 -*-------------------------------------- - .DA S.NewPStrYA $10 - .DA S.PStrCpyA - .DA S.PStrCat - .DA S.PStrCmp +Kernel.Init2 >LDAXI MSG.Init2 + jsr PrintCStrAX - .DA S.PStrGetTkn - .DA 0 - .DA S.GetArgCount - .DA S.GetArgA -*-------------------------------------- - .DA S.LoadBinA $20 - .DA S.LoadLibYA - .DA S.UnloadLibA - .DA S.LoadDrvA - - .DA 0 - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- - .DA S.ExpandPStrA $30 - .DA S.ExpandPStrYA - .DA S.GetEnvVarA - .DA S.GetEnvVarYA - - .DA S.SetEnvVarH - .DA S.SetEnvVarP - .DA S.DelEnvVarA - .DA S.DelEnvVarYA -*-------------------------------------- - .DA S.MLICreateFile $40 - .DA S.MLICreateDirA - .DA S.MLICreateDirYA - .DA S.MLIDestroyA - - .DA S.MLIDestroyYA - .DA S.MLIRename - .DA S.MLISetFileInfo - .DA S.MLIGetFileInfoA - - .DA S.MLIGetFileInfoYA $50 - .DA S.MLIOnline - .DA S.MLISetPrefixA - .DA S.MLISetPrefixYA - - .DA S.MLIGetPrefixA - .DA S.MLIGetPrefixYA - .DA S.MLIOpenA - .DA S.MLIOpenYA - - .DA S.MLINewLine $60 - .DA S.MLIRead - .DA S.MLIWrite - .DA S.MLICloseA - - .DA S.MLIFlushA - .DA S.MLISetMark - .DA S.MLIGetMarkA - .DA S.MLISetEOF - - .DA S.MLIGetEOFA $70 - .DA S.MLISetBuf - .DA S.MLIGetBuf - .DA S.MLIGetTime - - .DA S.MLIAllocIRQ - .DA S.MLIDeallocIRQA - .DA S.MLIReadBlock - .DA S.MLIWriteBlock -*-------------------------------------- - .DA S.GetDevByIDA $80 - .DA S.GetDevByNameA - .DA S.GetDevByNameYA - .DA S.GetDevInfoA - - .DA S.GetKeyboardEvent - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- - .DA S.ExecProcessNewEnvYA $90 - .DA S.ExecProcessYA - .DA S.CreateProcessNewEnvYA - .DA S.CreateProcessYA - - .DA S.GetPSByIDA - .DA 0 - .DA S.Sleep - .DA 0 -*-------------------------------------- - .DA S.CheckPrefixA $A0 - .DA S.FileSearch - .DA S.LoadFileA - .DA S.LoadFileYA - - .DA S.ListDirInitA - .DA S.ListDirInitYA - .DA S.ListDirNextA - .DA S.ListDirCloseA -*-------------------------------------- - .DA 0 $B0 - .DA 0 - .DA 0 - .DA 0 - - .DA 0 - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- - .DA S.ScreenSelectA $C0 - .DA 0 - .DA 0 - .DA 0 - - .DA 0 - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- - .DA S.COutA $D0 - .DA S.PSTROutA - .DA S.PSTROutYA - .DA 0 - .DA S.HexOutA - .DA S.HexOutYA - .DA S.DecOutA - .DA S.DecOutYA -*-------------------------------------- - .DA 0 $E0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- - .DA 0 $F0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- -Kernel.Init sei + sei ldx #$FF init 6502 stack to highest txs + sta SETALTZP + stx A2osX.SaveSM stx A2osX.SaveSX + + sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F + lda RROMBNK1 Make sure ROM is enabled for X.PRINT.F cli + + >LDAXI MSG.Relocate + jsr PrintCStrAX + + sei + sta SETALTZP + + >LDYAI A2osX.BE00 + >STYA ZPQuickPtr1 + >LDYAI $BE00 + >STYA ZPQuickPtr2 + >LDYAI A2osX.BE00.SIZE^$FFFF + >STYA ZPQuickPtr3 + + jsr Kernel.Move + lda RRAMWRAMBNK2 + lda RRAMWRAMBNK2 + + >LDYAI A2osX.D002 + >STYA ZPQuickPtr1 + >LDYAI $D000 + >STYA ZPQuickPtr2 + >LDYAI A2osX.D002.SIZE^$FFFF + >STYA ZPQuickPtr3 + + jsr Kernel.Move + + lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 + + >LDYAI A2osX.D001 + >STYA ZPQuickPtr1 + >LDYAI $D000 + >STYA ZPQuickPtr2 + >LDYAI A2osX.D001.SIZE^$FFFF + >STYA ZPQuickPtr3 + + jsr Kernel.Move + + >LDYAI A2osX.E000 + >STYA ZPQuickPtr1 + >LDYAI $E000 + >STYA ZPQuickPtr2 + >LDYAI A2osX.E000.SIZE^$FFFF + >STYA ZPQuickPtr3 + + jsr Kernel.Move >LDYAI D.STACK.TOP >STYA pStack init Soft Stack - stz A2osX.SCREENS - stz A2osX.ASCREEN + sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F + lda RROMBNK1 Make sure ROM is enabled for X.PRINT.F + cli + + lda #6 + sta A2osX.HZ + pha push HZ + >LDAXI MSG.HZ + jsr PrintCStrAX + + jsr CPU.Init + + >LDAXI MSG.K.INIT + jsr PrintCStrAX + + sta SETALTZP + lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 + jsr S.IrqMgrInit bcs * jsr S.MemMgrInit @@ -201,196 +117,149 @@ Kernel.Init sei jsr S.TskMgrInit bcs * - >LDYAI MSG.Init - jsr S.PSTROutYA + sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F + lda RROMBNK1 Make sure ROM is enabled for X.PRINT.F + + >LDAXI MSG.Init2.OK + jsr PrintCStrAX - >LDYAI MSG.Init.Startup - jsr S.PSTROutYA + sta SETALTZP + lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 + + >DEBUGOA +*-------------------------------------- +* Kernel Stage 3 +*-------------------------------------- +Kernel.Init3 ldx #DEVMGR.SELECT + jsr pDevJmp + + >LDYAI MSG.Init3 + >SYSCALL SYS.PSTROutYA + + >LDYAI MSG.StartupFile + >SYSCALL SYS.PSTROutYA >LDYAI STARTUP.ARGS Get A2osX.STARTUP full path... - jsr S.NewPStrYA + >SYSCALL SYS.NewPStrYA pha >LDYAI STARTUP.CMD Get SHELL full path... - jsr S.NewPStrYA + >SYSCALL SYS.NewPStrYA ply get back ARGS in Y phy pha A=CMD, save for discard - jsr S.CreateProcessYA - bcs * + >SYSCALL SYS.CreateProcessYA + bcc .1 + >PUSHA + >LDYAI MSG.StartupErr + >SYSCALL SYS.PSTROutYA + bra * + +.1 pla + >SYSCALL SYS.FreeMemA pla - jsr S.FreeMemA - pla - jsr S.FreeMemA + >SYSCALL SYS.FreeMemA - >LDYAI MSG.Init.OK - jsr S.PSTROutYA -*-------------------------------------- -S.KernelRun jsr S.TskMgrRun - bcc S.KernelRun.EVT - lda #A2osX.SCREENS.S - jsr S.ScreenSelectA - >LDYAI MSG.KRNLPANIC - jsr S.PSTROutYA - bra * + >LDYAI MSG.Init3.OK + >SYSCALL SYS.PSTROutYA -S.KernelRun.EVT - jsr S.GetEvents - bcs S.KernelRun CS=no event - - jsr S.DispatchEvents - bcc S.KernelRun CC=All Events Dispatched - - jsr S.SelectProcess0 - - stz pEvent + >LDYAI TskMgr.Table + >STYA pPs -.1 lda (pEvent) - beq .81 - bmi .8 Discard any timer eventa - - bit #S.EVT.F.KEY any special key? - beq .7 - - ldy #S.EVT.DATAHI Open-Apple? - lda (pEvent),y - bpl .7 - - ldy #S.EVT.DATALO - lda (pEvent),y - - cmp #$31 - bne .2 - lda #A2osX.SCREENS.S - jsr S.ScreenSelectA - bra .8 - -.2 cmp #$32 - bne .3 - lda #A2osX.SCREENS.C - jsr S.ScreenSelectA - bra .8 - -.3 cmp #$33 - bne .7 - lda #A2osX.SCREENS.G - jsr S.ScreenSelectA - bra .8 - -.7 jsr S.DumpEvent - -.8 jsr S.DestroyEvent - -.81 lda pEvent - clc - adc #S.EVT - sta pEvent - lda EVTMGR.COUNT - bne .1 jmp S.KernelRun *-------------------------------------- -S.DumpEvent ldy #S.EVT.DATAW2+1 - >PUSHB (pEvent),y - dey - >PUSHB (pEvent),y - - ldy #S.EVT.DATAW1+1 - >PUSHB (pEvent),y - dey - >PUSHB (pEvent),y - - ldy #S.EVT.DATAHI - >PUSHB (pEvent),y - ldy #S.EVT.DATALO - >PUSHB (pEvent),y - - ldy #S.EVT.hDEV - >PUSHB (pEvent),y - - >PUSHB (pEvent) - >LDYAI MSG.DumpEvent - jmp S.PSTROutYA -*-------------------------------------- -* S.ScreenSelectA -* IN : -* A = Screen to display -*-------------------------------------- -S.ScreenSelectA and A2osX.SCREENS Screen is available ? - beq .9 ...not setup up - - cmp #A2osX.SCREENS.S - bne .1 - sta SETTEXT - sta SETALTCHAR - sta SET80DISP - sta CLR80STORE - sta SETPAGE2 - bra .8 - -.1 cmp #A2osX.SCREENS.C +Kernel.Move ldy #0 +.1 inc ZPQuickPtr3 bne .2 - sta SETTEXT - sta SETALTCHAR - sta SET80DISP - sta CLR80STORE - sta CLRPAGE2 - bra .8 + inc ZPQuickPtr3+1 + beq .9 + +.2 lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y + iny + bne .1 -.2 cmp #A2osX.SCREENS.G - bne .9 - - sta CLRTEXT - sta CLRMIXED - sta SETHIRES - sta CLR80STORE - sta CLRPAGE2 - sta SETIOUDIS - sta SETDHIRES - -* sta CLR80DISP -* sta SETDHIRES -* sta CLRDHIRES -* sta SET80DISP -* sta SETDHIRES -* sta CLRDHIRES -* sta SETDHIRES - -.8 sta A2osX.ASCREEN -.9 rts + inc ZPQuickPtr1+1 + inc ZPQuickPtr2+1 + bne .1 +.9 rts *-------------------------------------- -MSG.Init >PSTRING "A2osX[Stage2]:Init\n" -MSG.Init.Startup >PSTRING "EXEC A2osX.Startup...\n" -MSG.Init.OK >PSTRING "A2osX[Stage2]:Complete.\n" -MSG.DumpEvent >PSTRING "!Unhandled Event:Flags=%h,DevID=%h,DATALO=%h,DATAHI=%h,W1=%H,W2=%H\n" -MSG.KRNLPANIC >PSTRING "\n!!!Kernel Panic!!!\n" + .INB X.PRINTF.S + .INB SYS/KERNEL.S.CPU + .INB SYS/KERNEL.S.INIT +*-------------------------------------- +MSG.Init2 >CSTRING "A2osX[Stage2]:Init\n" +MSG.Relocate >CSTRING "Relocating KERNEL...\n" +MSG.HZ >CSTRING "Kernel SYS Timer Set For %d0 hz Machine.\n" +MSG.K.INIT >CSTRING "Kernel Setup...\n" +MSG.Init2.OK >CSTRING "A2osX[Stage2]:Complete.\n" +*-------------------------------------- +MSG.Init3 >PSTRING "A2osX[Stage3]:Init\n" +MSG.StartupFile >PSTRING "EXEC A2osX.Startup...\n" +MSG.StartupErr >PSTRING "SHELL A2osX.Startup Failed with Error : [$%h]\n" +MSG.Init3.OK >PSTRING "A2osX[Stage3]:Complete.\n" *-------------------------------------- STARTUP.CMD >PSTRING "${A2OSX}SBIN/SHELL" STARTUP.ARGS >PSTRING "${A2OSX}A2osX.STARTUP" *-------------------------------------- -ENV.A2osX >PSTRING "A2OSX" -ENV.PATH >PSTRING "PATH" -ENV.PATH.VALUE >PSTRING "${A2OSX}SBIN/;${A2OSX}BIN/" -ENV.LIB >PSTRING "LIB" -ENV.LIB.VALUE >PSTRING "${A2OSX}LIB/" -ENV.DRV >PSTRING "DRV" -ENV.DRV.VALUE >PSTRING "${A2OSX}DRV/" +* Global Page *-------------------------------------- - .INB SYS/KERNEL.S.IRQ - .INB SYS/KERNEL.S.MEM +A2osX.BE00 .EQ * + .PH $BE00 + .INB SYS/KERNEL.S.GP + .EP +A2osX.BE00.END .EQ * +*-------------------------------------- +* LC AUX $D000 BANK1 +*-------------------------------------- +A2osX.D001 .EQ * + .PH $D000 .INB SYS/KERNEL.S.STR .INB SYS/KERNEL.S.CIO .INB SYS/KERNEL.S.FIO .INB SYS/KERNEL.S.MLI + .INB SYS/KERNEL.S.ENV + .EP +A2osX.D001.END .EQ * +*-------------------------------------- +* LC AUX $D000 BANK2 +*-------------------------------------- +A2osX.D002 .EQ * + .PH $D000 + cld + .EP +A2osX.D002.END .EQ * +*-------------------------------------- +* LC AUX $E000 +*-------------------------------------- +A2osX.E000 .EQ * + .PH $E000 + .INB SYS/KERNEL.S.JMP + .INB SYS/KERNEL.S.RUN + .INB SYS/KERNEL.S.IRQ + .INB SYS/KERNEL.S.MEM .INB SYS/KERNEL.S.BIN .INB SYS/KERNEL.S.DRV .INB SYS/KERNEL.S.LIB - .INB SYS/KERNEL.S.ENV .INB SYS/KERNEL.S.TSK .INB SYS/KERNEL.S.EVT *-------------------------------------- - .INB SYS/KERNEL.S.DEV +* Make sure KERNEL.S.DEV is the last one *-------------------------------------- + .INB SYS/KERNEL.S.DEV + .EP +A2osX.E000.END .EQ * +*-------------------------------------- + .LIST ON +*-------------------------------------- +A2osX.BE00.SIZE .EQ A2osX.BE00.END-A2osX.BE00 +A2osX.D001.SIZE .EQ A2osX.D001.END-A2osX.D001 +A2osX.D002.SIZE .EQ A2osX.D002.END-A2osX.D002 +A2osX.E000.SIZE .EQ A2osX.E000.END-A2osX.E000 +*-------------------------------------- + .LIST OFF MAN SAVE SYS/KERNEL.S ASM diff --git a/X.PRINTF.S.txt b/X.PRINTF.S.txt new file mode 100644 index 00000000..fb2c70e7 --- /dev/null +++ b/X.PRINTF.S.txt @@ -0,0 +1,177 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +PrintPStrAX >STAX TmpPtr1 + lda (TmpPtr1) + tax + beq .9 + ldy #1 + +.1 lda (TmpPtr1),y + ora #$80 + jsr $FDED COUT + iny + dex + bne .1 + +.9 rts +*-------------------------------------- +PrintCStrAX >STAX TmpPtr1 + pla + sta X.Save.RTS + pla + sta X.Save.RTS+1 + + ldy #0 + +.1 stz X.b0Flag + stz X.DigitCount + + lda (TmpPtr1),y + beq .9 + cmp #'%' + bne .4 + +.11 iny + lda (TmpPtr1),y + beq .9 + cmp #'0' + bne .22 + ror X.b0Flag beq -> CS + bra .11 + +.22 bcc .21 + cmp #'9'+1 + bcs .21 + and #$0f + sta X.DigitCount + bra .11 + +.21 cmp #'d' + bne .2 + pla + jsr PrintADec + bra .8 + +.2 cmp #'D' + bne .3 + pla + plx + jsr PrintAXDec + bra .8 + +.3 cmp #'h' + bne .4 + pla + jsr $FDDA PRBYTE + +.4 cmp #'\' + bne .7 + iny + lda (TmpPtr1),y + beq .9 + cmp #'n' + bne .9 + lda #$0D + +.7 ora #$80 + jsr $FDED COUT +.8 iny + bne .1 + +.9 lda X.Save.RTS+1 + pha + lda X.Save.RTS + pha + rts +*-------------------------------------- +PrintADec ldx #0 +PrintAXDec >STAX X.HexBuffer + stz X.BCDBuffer + stz X.BCDBuffer+1 + stz X.BCDBuffer+2 + + phy + + ldx #16 let's roll 16 bits + sed +.2 asl X.HexBuffer + rol X.HexBuffer+1 + php cpy will disturb carry while BCD adc + ldy #0 +.3 plp + lda X.BCDBuffer,y + adc X.BCDBuffer,y + sta X.BCDBuffer,y + php + iny + cpy #3 Last byte of X.BCDBufferBUF? + bne .3 + plp + dex + bne .2 + + cld + + ldx #0 + ldy #5 + +.4 lda X.BCDBuffer,x + pha + and #$0F + ora #$B0 + sta X.DigitBuffer,y + dey + + pla + lsr + lsr + lsr + lsr + ora #$B0 + sta X.DigitBuffer,y + inx + dey + bpl .4 + + lda X.DigitCount + beq .5 + lda #6 + sec + sbc X.DigitCount +.5 tay +.6 lda X.DigitBuffer,y + cmp #"0" + beq .7 + + sec + ror X.b0Flag + bra .8 + +.7 cpy #5 + beq .8 + lda #" " + bit X.b0Flag + bpl .81 + lda #"0" +.8 jsr $FDED COUT +.81 iny + cpy #6 + bne .6 + +.9 ply + rts +*-------------------------------------- +X.Save.RTS .BS 2 +X.HexBuffer .BS 2 +X.BCDBuffer .BS 3 +X.b0Flag .BS 1 +X.DigitCount .BS 1 +X.DigitBuffer .BS 6 +*-------------------------------------- +MAN +SAVE X.PRINTF.S diff --git a/_MAKEDIR.txt b/_MAKEDIR.txt index 23908067..ea391711 100644 --- a/_MAKEDIR.txt +++ b/_MAKEDIR.txt @@ -2,17 +2,16 @@ PREFIX /A2OSX.BOOT CREATE BIN CREATE DRV CREATE ETC -CREATE INC CREATE LIB CREATE SBIN +CREATE SBIN/GFX CREATE SYS CREATE USR PREFIX /A2OSX.SRC CREATE BIN CREATE DRV -CREATE ETC CREATE INC CREATE LIB CREATE SBIN +CREATE SBIN/GFX CREATE SYS -CREATE USR diff --git a/_MAKESYS.txt b/_MAKESYS.txt index a11e0e53..d42a8256 100644 --- a/_MAKESYS.txt +++ b/_MAKESYS.txt @@ -5,7 +5,7 @@ AUTO 6 PREFIX /A2OSX.BOOT BLOAD A2OSX.SYSTEM DELETE A2OSX.SYSTEM -BSAVE A2OSX.SYSTEM,TSYS,A$2000,L4864 +BSAVE A2OSX.SYSTEM,TSYS,A$2000,L$1000 -A2OSX.SYSTEM MAN PREFIX /A2OSX.SRC