From 06f901b1212bdc67d9397f851b67f3126c5976e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sat, 5 Oct 2019 19:24:41 +0200 Subject: [PATCH] Kernel 0.93+ --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/HTTPGET.S.txt | 124 ++++++++++++++++++++++++++------------- BIN/TELNET.S.txt | 54 +++++++++++++---- INC/LIBTCPIP.I.txt | 1 + LIB/LIBTCPIP.S.FRM.txt | 23 +++++++- LIB/LIBTCPIP.S.SKT.txt | 62 +++++++++++++++++--- LIB/LIBTCPIP.S.TCP.txt | 8 ++- 7 files changed, 209 insertions(+), 63 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 393a82826ac82accecff1464bc58ce2acf27ddb5..e97510561893725337cfcd2619176ce6a7d128b4 100644 GIT binary patch delta 46653 zcmaHU34ByV@^HV&HF+=h+*f8MncT^c%p@d(3WN|yB#;vkM4TanOCW&+xlMwAC?pUN z3KTS;s8OPct{@6Z)KyLix~}UDo_MUldaQp}<*V*~GYRPL+x^MRbXQkbS65e8RabXf ze!CLgg8%g-1q-UJ$-%D#6{if{`fc!dgwIcLEfo#1PnxIHkKdTB035656!*yF@B6h&^Kh~I@{WS86Q=*}!sG_vOSzb2! z*|YB-35vPPK*l6R#uD-wu@$FiRnI>7@l#<8@v{|QKCcsghsdxbYx4_9`sCR3+VruR zZ)EDSW@WW!y^=M`nLnf|`7hj<+yW-b2jIU%TFvAUl5ufmA|Cm$@~$X#h%Rk zy!>u=xBHO$2e&JCYOatMl&8we$s3n9Ij=mkI&*U7>dcI+j4UVq|3dbEvsF3KIfOiA z@$^Tu>GRtX^KEv!Eoz11dy7Z!eUtvv)(D5flAM+QNiXoGjl2|U8=7bnQf%AOY~xbO z4&;4r_4FIRw|Tm)p5s@#ZJw{M^hjM~@6k4^r`_i9V)0Wp#L^w_>5uO0#F|fSbO!a->|~XlA-y;4ETCXrtJ|C& zTVKNFAlo+yozaJ!o{lM4%&_nMoZ<~$GiB{9-cHNjpx%+YvGs|V|8`1yL+}S8z#m;V zw`F^}6m2=4u9mVV?VV{9@T1B3{V`bkQ>UhPW+|}sW`z4~)dpoTR zV`BlsXkr-07wn!-fB(3@#@0R2W}BVZa(n>4+(M>-w_*_~nOdE7-r4owxN?>>QVmOxhcAq&$Cj zTET8l!S3pU-L=@$_t@#={N2j@-6INi&%uJr-Q)AqgiBNQ&#-mZ*)}rNT|!$noE4L_ zQDymi&tXmdhh-UTX&@md9?Jw zC-P79|El-0!QK4KhtQ@Fa+|U18e3CRPx-MfvU5qnu`YrAJLvny;|04;6zu>0rS6L_ zZCp~&wzOcQ!_$`JLH;ItcBOcBrFwRyQ7(Uz)DvN|B=rP$9V+m4JzwA*psh3LP+k7c z806)DZKIO#*PQ%IL+Nir%um8YoKkzi1@HI1?yuz zZNCe8gM?&lIu-0)gQ-~Emf(SZ2MLDo1kaW!or**FGiKw6nHmSKv}3(fPA7T#&`zEa?)V3}yRqsvh$=%=Nxpe(grwT5di|JSFCEuMaxMbUZs-XQ; z!Oo8gy2PFTF6eIZ>^xnt@5Y_K7wj9iGm@$rY@=lBc2|?9!28t6g6~chTq-;Ad%@Zp zk3@RbjyrO?VDIOnQIyw|tS!arBOetUe~xz_g57VHux$571t0&rpkGI;Py4%XKUu)= zw(Q6C`drCwCtTh%!XT7EY;4lHX4E2?>reFm)S1vlI!4;g+L5tsO`b9TyPLw%pZo#@nf*`l&ytY*qU4 z*#21Cr4$Mk!|Nk@l-}c^$j^3ncO%4ijIgQKWav9ndQ0ZSuDx|Vevq|OZU2PIa3NLr zC$z>TZO@*Zf5WZ${VJTD|8&w>Es=F*i-fAdmyf@2-l%ep+8fdta-;wXw~Vk=TJzg% z`F>5VSyQpL()MI#PeiA9NSohLf#Q6x-rE)0d1HHeep|+01KIV8 zrp4D(t*y4bkkdWU6M2)TKiu}Kt!<*G{U*;|as<_mD#=t^?CDn?I~v#jW7kVwDjIK< zUC0?|dN!vsytnF!mFsL}Kjn0$_EuerIUaH;ttaica7lGM=#r_$YWpe2w%gTHh)e!E z7iy^`LwiEHg6Q|d1zw~chgzvl>Ks18b18&&@biNs_*USZZTrMUaUKupkLZe}4Ygg$ zvhQ5SLobDO1=HW5T@wD*du=;l;hd3X$Ml?@psp*ZyRo6Zw`%WqRPrk3dp*dv3U`TZ zwR`_<&^u?Oagx{5?e!d2_J6#~>)BWNwQ_A`%i9}o^XwgFJ2YhP^|n((Y?oZN*M~kb zX5Uy8^IA{A7h|62p5ggo?B??JT2I>y&tUx1W&HbnVDBAit)A}bo=%a!w`;l|`I`ma zw&0^1eI7)9Xb7b^$A;9#A*D~v_k2F4djaA`U5LbY8U`qzhnV-@?y*(Co?k}Vn&)}C z=W)dI0*EQv+dX?nBh7nDDD`9TAEcg>u0N9IsT;F9&2xc%8H-=M1^Dd?f6*7LXmFQv zvCDlEO0PVzue|gMW7!xu3iW1>%`Gb;gJ2SNBN81#*5+xK2L2iX~UGa7iFBLglehHmYZ&jM2-^gX;Qs`zS zmMXgl3f18P)Rn^M>&mIh=X;ocn-0TmdJ-${j6GEB>8M(NG@|EcT=0j+vLA8ygNgq~ z(L#n$4B;_?Ntg^n3`sg^tfyZ*c2wX0WBYKZG$du$AYaej*#Ao>=~8ZFVzKuEid;|f zy`B1wDpoq*)3(6FOJnZsG;~zqa{un7-IM5Y_jacDR_#nf8|B7+q#zZWq#sIylQF0^ zCc__wq@>_!o~LdFODvL50iIYPvHAC*J8KATj9ytK={kq>j!X;g52suZpIAB5c4UMH ztpn6lew&Ih?1^K&RkpIsp0B8W`xI5?zKXR~`zmqyU&xV{Xsqp)yskLDK!b5zb-nCm z$m5R3^{1eqW@nd=I~W`%{1(!T8aAuo$Ry7kf+MLM$@JPK+B}9g524NJ5`Aj82k9w$ zC5vJ@9@B3_JcAnF;^FPXQ7`_xi?+h0fs2=pDdtjDXV%`Jg5HrOzu)57Hg)#yTj-{E zY2R&+Hc#shdi+vuiGKbpPuncdz4K>#(!$ziduHqBBfsZk!2-(m?uEE+Z);oV>0add zVp`iG4_(yD^Y)Di8G9*-8>F{Zd-`37^(Wg&XU`w|#ym21Z@TUCp$N!^!Uz#AMWK$x z*|E*bLp^kCs2)BsC25CpI`0wu+9|Iq90$OFT4HF+dtxrp@zN5;7d2H^U^fV+sA@Wt zpS-AI_6Ge?4L2HuvBC)0Wll=9V1w+TEhBLExegn1jhVwVW=ne40i)2~9+MkSRwabT zpl@?(B6Xe)KKQt>C(djfMT)DcoYmuMoD<56$|p?N;4H3eb&M(^rqNLNBAP|TF!e=2 zf8AIHS6EfytSFu^x^%+WdpTepQI?SOqsduBS4t+1#_IB_8t3Q<)orvs&rJ+B!qbQ# zd>n@|ltDlKM3dy}7ljBh-+6STHHd3B=~l)xh+_f*FOk`LHlVsD!5v3)w;y zoI5Ox6so~~M9}5eko0P2X+_bPvCh$TcZ`|mo7H$1?aoC)CX#fby=kC+d|^>Lt;!{) zNl<@8Fluim{l z!maRsM}#zC8YI3Xqzt_cyN~nw8*HWMJwu7o#|N*Sjy1@`qQat*Vkc)&Hi@r=mX`#J zFasWZNiZww2y|478fcj75SwQXZctNG#-;~pnl-q*v|=OeXecqv9$bt=XW%*6BxDZK zrI|aZmX91syPcC}nunD*KAE(d!kUTIcR9llZ8k}q55AX$1YrUFP;J{Rg~INa1*K5W ze#4=cg*c%BPQ5G`goW_s%fbl5qQS`gWFwm!Vfax&JFJOPvv?2;r^ZE;cgV7|1S_k{ zi^dg>9$n=u9K*(!O$^JR{U{3K^1-!K;FvHDB_S&iv3lj8T86lQC|7a3wmaecQNb!S zgU~0$3oT&l6EcNX7~dzPD^?Tm&Niu`tq%us7d+O7%6u)n-G?K;8-7N3%X%4eagDRw zIl6e%#Ig5K#yhfei2WYOc}1`Z_rm4*4y&*MVi(}YM#!NbZBR)++F{`WhdqANU@T?0 zl!~j?Gc*O+B)J1(Ulo#sEs#$?w!*Ei3dzEKum(SJx5>=ePSRV;<}^0dEog08)=<}4 zxwvj|9Z>@oSNWE-)(n&xcEHE43VO#*tg5bC*jnMMy}hn!a4Y5g9BJ|cV0;aG+yx`) z$8MPU8jj{cxcfCBJ@p~E<4%gEX;GbT{#7XU@aojP@ZM`eitsQ9e-~0iAHlhZ-v>kf zE?80@_lOrzdWdu$=O5p4YpBg4%iK0*b(cI+F39kS&A^ukh2nR$p{DT6#Mxga6Neh4A z58>|+yV#Ku`Z}Vqy#d1)JFMZyIJ1+E!_37Fhj0Qm(2tYQv)Ex5PQj29f?YTbl_!J( z#hU~Q_qkN?;0ZygI7491a{Mvv4u?|chgo+xQiZdynSQ(lhwgBs32(#5lQ^^gz|M^C zKMh???8AHCGFo}e^am| zevbrcF3Js<-e+*AdM?Sbe;IslqDcM+TJR(M2VQFW5pG*E->h($tieLHlP*R75akt#z2*!h<`8J@7fgwv0uC;W zLk^HdIjt1f-medbm-_{sUPKt&M4V$}4&X45Rb~k~R^m)XK=(>Vf)EM)D;!zvVAHT2LA4ZO1o1wjk{qaQl3--(0P!*Kdx zfLrK?5tiQRuv}+CdbMUwi%c)2BnLMb3ny3?FH>5{WTKF5FgZkTh5kDoI~LM4udK2D!_`GDkdV>k--5K%?`ai=_-Kgs+$;q+f7W#yk^}$ zgaiLjT)$rBiV7lM2a#VK36dOv9t!1CgY?nLP_j13C?)c+blSl?rUq?^9QlcYkdfhp zW7pG!QRNXUM@t=nMRyTe8f_XM?F zNbv5zkN{;D;w;+e-nWhmn`=8`F}`qa_Xmk+V*a=57_68ZWEU>L?zuq~DPJYFT}bQ_ z_CABHY2<7N3!hy`WFKF#4|GsIgUvrBB={~Q?6ui~4)>VXe${Q_aY7^e*!LCoxiXL}yrvtehzW0fWBewgaZ9aKQ3xy`f(vUR}E^x*?A|H z$m~pNhBLp8bwspM4za0BTMa{6C!{9aMRv}pTS}xgIMRlBtF8u z)k8uaN4OX~d!W<>1o;WM-c3TDqrDwHJTDFlpqdSJe?iM9vqzmL_V z_6}whmuA&7GE+-iM@<}4T{@+hsGo(7^h}lOZ*(wp@(|~9h*NcdHm^bcPpKHScxFY@ zA`*F!GHz+>Z2V2Mhal!3$(q;~ujY{BFyqje;_@*h;>Z9_eXE&y~eumRMq)rkf^`2>GsRr>oS(fg=^>4 zEgK$tn!5 zcZ`ixJKnt-z3N|s(W8$ugXrIbi&w^Kt27^QsSQj~84g(Wq1@g-X=z0Lkt~gloZK}< zO^fDb)e!Z^NF#b)GJO-Pi>rwG+%{i{3N2d3^G`V*|4L2%j0^tvo{})(i)}BLXd!l3 z$+O#E5B)kTMj>1+#z6u@PW3>rfV!nNAmK?N+xMs(?ofekJIXNG>`@9xNae)Rnk{rW z`1_Q?Wjr|~O@hAvMWh&_BLrs-ThUAgrAQgV1$&;EtF^161$n{GE-M|y&e4e!Bg3E~ zi-nF)bG1ovg0lc>=i&aRk_l0BLPQNE1S3hrq=mxwlZ|Sf5Wuv-IjXufhh*!a;aKPp zwCy^Ng}M|*0eUOur6@cm7!sUTAeh1Wt14CDu>hW|6bSLq6P%Wg&fW*XX-SF%8+>~_ z)DBrWc~uHy5}fUH8N!o!->E6k`eAa4lq&4x9U0T0wI)=r(5FLdPM+@i3=St{BEaa0 z}99VN%`1V7m7N}6Z^55|f2dUWKM41c+@q&USI7alTXpgHroew`f>Ork^l zV3!vZr>IomQ;E9##|3}s&5LMhc!+aQ<1tm^$*=Q6B1ubt#1Mm&WRRwX^GpGKO0hx;TQ%Vs7K2RvHQ&Ti3*^B{g5fiRcn(xb87%>6QpWnWzre zk)3lEEF%s*m^XM63k=v1-JEiW(u5iVmxpMkn=#!xoj<3sv2I2y2~Q^JQ)!>p6v*1>jd!FnU0zl;33WMc zM;J)F3;!ch8Xe^_YMg4*;kI_KM#z9Y<3)SnGNR0+w#_mkW#QnsZKHOQoqkSLPAsmP z>?|eHkN}gVY#Cb~NzH-F8@(xl3tH-P)x+H~s$3Zrx@~zfpN0nblrQrsx*))(!WlD2 zq6g-+c@v_B4dRmaI?5%Da6OzW71iPm@@Or?p});*HjMb|(K<$gv)yYCBFTmHOHxG9 z!03zl=*O_pC*bJE$|RQrMlY2HhNl|`tueDSisUj19}l*1Vwf5o1IDijfkC<}z`M+4 zhD$NCf+1^@H&zi}2^SZ;EEx9g7$<5IYAEl}c*`N$i36-1Q#xU^b4*onG11=yotwNm z;bzKBbqH>?7}suXc4=XbSQkURUvwXsHolchbNDowiE4~n%fc3r=_D^?ZT32%Fm@e~ zH_db|N#LADlwW$Gougo$ik`_{qI?RhW zGnI|>6AkR9z%=L=Lq}7tF5(WkZ5}Z#fpZ;Rqp&nE8NsflM7c~xfzAL!u_7=ps+F`Y zx^&}c?4Aa&h+`FR+&MuEQKRWktA`9!CpWWdC4y#P)Ut)nYrF~lfw^d_QXCl8#>Jpq zEk||kf{R%u-&80O&d5=u+y)wZY0%K0x z2+do)2^ek)MdOFLZJ>NV&piE0zVpfMujsVc4{md&)%tVVy~s+tO7-U4TqyG$19 zGGH5L0g1hjs>S84v&Ss*&95t6K(yPydxKl87Pk}sK961lRb$p2aPNKI_y}|r{6o5* z4au#2fcpfL1`NYFYbpvek^Q^m(V)k`*#BT)G@6H?WtB@EiQWQ3g)_JZBcRVndXoX2 z2I~3xagDC7K|O`&v=2i^rKl-Hzkx0?CHe{sE4m9zIk|`$Jp{kgBR40pj}NS>>beCp zh`I|dSBff(H@B{InT7p>CLJAvYbX7w!IQ3edOH#w(K9gqURh+Hpf>UV@CrNyUc2xr^n*7ZBg+>7h3Ivt)VS3O{TpB(nyd*ThGTH$XOt@4aprl!nj&r@6~G~cgb zuI?=c5&yQV!2ZF-Eb^b!GM6PR1f2)uohXvd&)OJ1@rNcSy)b17~N1$~EP z(1qtFy6>ScFIkPuzsOX3Gga-EkQJy-Qm1ee1r;lGuB6NI1h|RvKl0T4fRGJWPXxwy zb6bh@qYR8&!%s42f99Ok{FigqhbBNkabp;o?H{@7|06qnGinFVEm8f-`926<`XA*a z?pOsx^BYtKOKRuuR8z3E_=ns#T0unMK{7#h5)|A3PY8lJH;Z<62={st9W!T=SoCOE zuxoz9=t=d9W)M}_)di?<4dDW`<|S(tIuUXtNs}!}0nbE=z^`X_z^4jezQ+ zaMkNIiOOhBRxJ88jnmP!@^`6>6_}jr;wYfjioVU@dZa*7V=r{zcuuTgKxXZq$W-d6 z%Z4+lXZ@*S4OfE@jS)J-5tRuZs?ujxSOn)#=8+BJurgj?GorQ%f1VH<$2SOEvdeVk z6HNk~ohqtQ#YDlG&u7GemE0~>Cke84oKk_qM%l`N^Ub+htCS+oMK;l(|3qhEumHk} z&*Mx9)=Yt_)Z&{fN~?vWadOh0ruh z*HI2(bOuA5*AI;KhCh#$Xod^24?Kv&$`SH}jQooUDdboNflH(032_rm5fTUgm@3Ak zh@%BmYiyMi2j)aMMqV9b`RYh1ftXvx27Zsl-?5YU@6riH z<>T?hnnc~q3o0g-RTq=E$@~|c^`f%k!YUFsWuS!F{v_s>ff7`Ygod(dm$c0YDjPH> zg2bU^N=xY>l8kBEK#7d$wt*6c$qSe3(7n<6U`V@5BTNVTOpGtg0H4CAYOdqJG{a@o z9J;4tOq=#V3ySI&EU2q(A}Tak{bl@Mov7vv6cyIi)-^QI{D}Zm_3Xt>GwPQtAh8(g z_BUl=vbcEz1(O!dDaYVe?EHbEs=C@cNbG`v0=DI7(6k-EQhUdkMfLNEs$rmzLe}j@J05&qL4k4!+N5mXI=@GqZ*E#Ik3IVJY+l z`Sijv=$R$zh2_vUHQ6Yvfb%E3W?>}=v$1d$4Bw2#&z;~4_L(trqVgmf2QAQW(yPYI ziS~7QIz_^2*fSfqu)E;sNv{Djsf7-g0dptpAwHw9j((`2BE%Ppf$ho;mr+=c8I__6 znmb&f!aZ=?DYVA#g+15?UYRY%!Kn_H5>qD-#)vlTC5o#ZVnTfh!Y0Vt;?fJ7!Fn1A z?0^w-ackZJtG2itm@9E7{dFH4-hwXEHaHiGoo|P;bH#W8;L==CE9`)rFf7~&);GO6 z)%}!P<;V$^$#FvtF+BhcTamn7&=H26?S`kex)RK2i8|58BH}}wyXfL$9t3rl4SQh7 z?wR@sv_hHQEFj5`K+JuvBw-&O(|VIC(8ly@KUtV%3v)ocRb6yLoU@>|wW@ArQT^ft zO+<+iY38Nv=UcI|n|Eh=3VQBy8H~!O<$5$OsjaQ-mC1Pq`p$Uu!rwsH=28pK!NO0% zH6a;pl6e4P=ZhJ_LGW#JC8^P_WS-|CB%6Ec`WN7#Z7!YgB6S$_n6%Kp&1FqWmZ*sLU$SHZX4WuE_900Rb(nIggj0LseO zsRKxLb<7*YuTz{=HPu9UOdiv5KBm|c=zSKp-hjHT_@)}?7@|Lk1;tAn<}9ki(z-h^ zGSW&BnNLCg0?`zHnzu8*iN_{hQ^XmhfZ9+w#Bvr!fXl3Yi_Zz20lq;I+uKl4FIwZ! zrlhk)Ybwgi%82$IXsyRQ5jn-d`Yt?FFUBYSOCA*NDrjlanHxQM0?T?UE3B@;&0q6A zoR9FS^=N6bvx#v|KL8CC>OO?n29(8*pkjwh6DfU+=;(ffX3HnAatBKHIhfxd>dVh_ zbIRYAA}2Zw7SnTq!G+Y^K+_W?VO>!X(S1$>RMdJN3`2BZfUpw-0Y8Olbeg!Yua*3S zZwQzciZF47Rsh5+7`v?UrYnXEca!XUZ7rIWRU%Z*~GsLYko z0{6a48cE+#W(@%7v`!gsxofp6_r(06&H?1K+FT+ z)LSM%_EOOtSMDD~1xK1v34On+lBFsvA4Ly8jMel^!XVV}ql<|gEcGUSbTKIab~6W? z%)zE`u=rcRw+A=Dsc?2Ls`Xo;ei?3p)1ZAB?x?rH**z}f5HB4?VQXR_H{%=-ZWIvalK|?i3Bq zN}{=oxjqYgiDTrM!S5|DH z$zbV3e~-U_s#}b8t>ZoD?+uh!R}~GEr)_{!tB~l8oai=AbURc&>Pkjq3W+v1Zysnm zKyk-FVSp;lmOx?60OZzz!T_Z5K2E>1O`y9eCKV9%cK=sr>F9eY)tEwudy*4WkD+zB z1F|1;skJ-#j5~6&v)5FPE-Ifmp@t;f4^tj<*@XvSQ?B*vgMLZ)Q=0ZQP;4b$OgI0(FKQF#6-;#!fYHcPsLz^#OUvnVC!9{dflUw<2-R!j&#pYVzL% zf9!Q5Wnm6cJtvo7;*X5Sb^z?FMQg%AlyKxVlW?utp3Gg{2SPpht%>WcyS@=t0q%G(~_Z8^l!yHi~AGLLUi* zZ{Qk{b(1@sSz;}aNl|m2U*gkERyS5DOrL45Nrg#Dw5)XY1J|~_p(-A6?Y_R8; z%VDrHdt)8OIBB*z=7m>OmDiNh;0goFNrb5jec6Ho&Molif`~I2p5E`%z~O~Ho#Ofw zT55#N$5FcR2>K_NxhyW74<->m)-M zO|`~Y$@aS?ZN_!fh^LljAZw<)yc(k>{un1w;z=9zleELZchaR%jKHw{QOsh#)aV;3 zjAX`}BC8NaHu*AzQ7|7rGVqK|_Bm9=0~Awd7Acm-(2=u@D*adj%?(i+MM5c@Yx3EJ zap3#PmlaVa$0f5#)_Cx}|lru*73A6DcZXRIIWU$@gvkFs?F`5v|EtE4o8{7uP zR6Kg#;5O;2(CnbG4N87s;S=>Vi2d59ipPKkJsG-sA$Vox`M}pBY82B4m=_G2d&F!3 zv-YUBHUp+E@fou*&LKOYDvWSYM~0%4ITtdE+()F@1MHi_*(c)l4;C{k!7CnL`7+?A zB|dWmMkiQsH=B6sITLSKia`QAbMrG4nz0~s;UJbS3Utp8;qcG}qZ5p!7?qG&YP*B8 zX$f?;xU~sOktlJQ|L90uPPxVwB3|QQa2zc)MM1-E)c%Majb!n^|%K6m-*stYmqkUAL41iI_hcG-j3enf~M9PK8$RV z>+XiA<-TDUuP9yaOAW`9HtK4cHnNi(QQ3z1aF{=r*$%sx`!dv<_!{(wiSZc9z8OAT z?z3T_f^p8W!Y4Ivkp*t6%$@rJ+)-`k3)_zXO=}e%r%{m!6k$|yhsDUZ|E$wC(&YJZa> z7)`$?WYka6N(VF?5QA|eWX$M4=nGS%JO#E@zGU;$oUQ~jbksx%A-q4gjxljp(K>`PF%4#D|%TsgWI$j*99 zHl0#28fUt60cLa|YW<6l^-olTcwHlUVU#9DdMU7COh<_m{g(-N9G%_=zURd>yqnSe zPnX&H8dl_Nr+$(WgB(oaUzg`Jj}#q)3;%SD5{^U0yDob!1}}C{ZmCc6sUFll(Xw-~ zW!I2oJp(Q8qWRDd57Cde;H7t6iHad_!-aQUPE2eYP)&w+Am#;8AA{kF9WyDJ&XCoR^qZ%oJGE zL9h4^fsrqZ`bg;q|JaEBM>-;{!uk{4!L)eeOH|?=V>&$Wt{06#nqTog&<8G+1_KP& zsLkQO$x6542pZ8W+@M$d!TM0gG9F^Qfoa_wf`=ORuUr~H_UQ1AMa%}bRp~?;SCjZ4 zaDIq}RtOa0RuF=>_d*2_?v~VwL?w7%5)%Y5&{V6)kf7%!F+Dy)wsRweL3R-KIjP1) zoKcW-7<1C1q4j+159gD0HbnTa^O&fn>O_PGBicN2H~j!Unt>e_=U+qy3CJ^ z!Tg}f#*=D@DH9&}#AQ_A9OQiL(k3f0{JVU{zf<-WEtN=&faT$XwC3wl_bJ3_Ul+s|8PE_8A%*92g9|yg!iaLuNk{GOTloR+c4CSne zLSF&4PhC1)rT>&_uxd0`LC$L!Ua#h`X*IC!Q&(#2L>ximBBH#Bf7&L&%b&WemdX6& z?5f_TaDr^N!2b}WdFr2fA=0flRMcE30NQDkw%Tiyq3$*m4*3XF&Ot%RAxey8P^}t; z!3+6R8nfP%(*?FY>uUYP3^d8e$s$oRIP?(e{u3p}GN`MfoQbVylKU)<(>9wz!Ie*4 zMvXLw(ub$Ixb@DZCyAJ7aywl9yQs;TM@O?XKrT{++ezGf|Kww6`(8G03%Ee)>tWjG zE?ve#I-Z8vONn|BCz9^cHHD+fiqU$I8nHW`d82Pa$v*7XrY)wCF`iB(y91gfv?V*; zmtBxTJPBILLT#?tWjG47EE5aIpeuz3dD3#kNrU7d;iqlw1KKIBZf9mbD6{FlD4%8 z;A?TmV`PJ=t(Jw3uppw_3|GE%X(KuU_)S}R)B9M{SlSdL75?7ix5I+3P+bEXq*dC1 zHFOs8NE{1K437L6?uYCXqF#Ccz2;(i5~|$==W!Phcgt?H^+EXLIHvr4_PI-Kl{#fq zLrL6T?v4)x5e*M>RF4Eu?PI7$KPsaVAEW304f9Y&AE%OyLeuqUp;13UC2=`3_xysS zeG+<4h-!_vpXv{Wp__}Z;VBFN-zDkdpGL~~(ZAR$_|5QVxUjmOg<)U2azg$_dxOF~ zZZkCOb%!Ps>A66wkOR0~C=c>ABw?&U#)d(LT_;6L*bBl2w65^ne^Hbc&zG3^IFG=0 zCvg{h2}XY7vZlW5?^n}DR|U&h;pXS~YCITvg|FtsS7GBfu7vQ{_%eBTc_ zDUjrTR_9QhW##A(zs2^-?ccey6EtsMC9v!~ok;%(^rU%*&jwd|7>}X11a$x8t8;K6 zc5HtaV()XS;m9eM7)-4H!dZCNWe!SwUx4-nX1nDBdEfewDG++mi-uv#8=4A<@gur> z=#oj~C#VbPwVhH-OV^wmAP)U|rs;_8yZ}S~jgI$cjPWY?{i4m~lM^{2bIv|bFA#*#L4EcDqtjO)ZjgX)~E)?VYDMeOFbqK@LWa_uV(=eOoHK-aUhyA$_O1@ zzPv~KMTNDvbtcU`wA<|@4udu{`-H>MYi~L;ME#7xV+#mR_;hxwpUPIEw$blQMF!5P zQtUAN3G^!xz&2jep=-GOL(v$FiOtE-`GilSPC;W36{kOO0(S^YD!lmwddF!2(-M=Q zY5HRl577(?IEk6msbva3i}Nni2}7Rrr7KKB!22W~L1**mM@r82Ut9^1C=p7Rd~$`B z$3M_r$;Ao>#$km0zIdG+hhcY^{aJhZ0?ZRT>edP#7HSI08b-kOtfWs`LzmuFpt09o z!&CkBGz_H^Zh&upaixS0mrZRvH5sG)@AiL+<3vg6XCI6_?<++U^WXpHGO2MUnN5O` zJJ}|QM{Dv|)RsCJ@vBQe1!HkMtCA&-)AJXN5sT#8KCag4>RR7|F+{@IV>_vbsLhF%PB0+I7J8j?}^E3 z93C_LP)HdcaBR~beP2|h@{o}lhjp!>NjN^)$TL~coxr?RMM^w&ix*Z_x`UzfcUSNv z6jp{8hsW^ZkQjf_&`6LcCy_HE+JRvTDwVj(Q7FS{Erwn?1g6K2c`yZnT+D`3L6GWWk7!Fo@`c zI}uaz5G0H564BXoR2ceWx5qI%3v1}+ol7h(c;F+^Tt-otj ztsbL}=c3#ig=Qr5d@QQt3$YKrH^hyiIs|XoF>X*DqA#M#LmMd-Q?#ftvPtF`i2g)O zkCny-dNP+1+=-#}qDz-`BbO)TICef_X#E~kl z0GZT+l`#Cs*qKfARsLc4sp7_@uKLgIP;c03pd%zt57u*Hm@p9p*O-Ken`9dDiGC7I z?9hgpFjR^7p?5xRfF=x9qRxxJ9MmbCdebe?a}M?QR9c}|Sf;_nFGN#x;m+Zkjy+F$ca; zxGmG7=5qY(oPxw)D3UG|_KRx7d6c+X5;5P;QY^#JBsIHZ>iNw1VPhL`Msl`OzH(&7 zh4{$E8Mh%uURaGh5M^v)gGh|KgZAa$5olI&+!A@L^ zpG4>3PZb;Q{cNw4YRD+A}p|5^o6KLLefBvtr+ z8FM%EekJM^+NYrZt?3$k|E1?kQ4@q=MX>)jLKEyFroT~&3<~vgAbcgN3H_<)Qr!^=vy0rR7f3Ilz~1$SgM zocl@)iFifkzMI6q2A97QEfE+kWXdj&Sl)n&8zcKm{t@Uq9#iOZ zaZ;a^3=!|jUFQ+&dvNR5qD7JL0knRNnSCF^!ntD-n?I5Ph7#>3JX(g6QC-(Gx~{Q_ z-VlpBhXANt+372Ll_=yqz2W>RRhTp$7Kgz?#M}aVRiAXvoo9EkrGtwuHX z-u^VwL=DtOx$PzcCOc8}Fu({jR?0Bmq18bTZq!EoU(}aiz1{$yMB%_p(0ftT1`)j( zVxrx6zX@X_pZPSw_@>KFC`9W(VYGrT8rPu>%D=}fFwBKwE6PQNC&EL~?i=ttw)cB6 zS&^9pAAc`qL?lxu4&yqx#E=SwF>XB`$2u>HDduz@g&H8Ws;+6#vdpEeBq0M9UKH(k zR(dzVgm$`wSl2f=DRtM0$|16coel9gdpdvmdLEJd5l56BH+W;+dPOehwI?nQ2|@dZ z_Q!f6VtydxSHRh<@(8q=`hy!~yV7|b^vAlh6xR!I_U>GZ5tG%K6*(NSalg)^R7HcZT`zews!%G@@+OP-JPpR0`v^w59O+9CsI_wIX7L9vK6E8)zR#6CN z^YYZ_6xvLI?KD*3Ff&~kXW<$I<3j3q^h!3iZ`vwE{Ql@!QHYfv(->Ve$~gh=E?Cid zY1PN0IQDIxZWHYIhKD|0jfOo-eVc^OZg8d>65(t<3ZH}aX40yY2768%M3(}#0yiEp zr&6tb{xjU`tZA4!Jw0BXPFaXi!wi{)7>&z>%>`~N8u2{^ZoL|<_iH*dX2a1#v6z=& z$zfgE)#!y@D+&^|NgY8gcp4JJ)TW`3gC**G$~*Lc1KBUcg72xuOXesv z;N>8u@jBdw3ul|O3gh+A87~=JXuSImDdgu%BsAjX&Qv4$dAFN9dD6dyzqN6{~K zg|-N88|KzzkLJpA5NIq~@P6DZ@1G_Q$e8tG;qun$I{KauzVf2bmC`3jw4>3Kr+R4+ z67@JlA|K5A?+S=zfdlLD0hH1hS@u?-FM5~@@$f|?rSX%{jPk%TV zoFHlRF;7PM@4ip0qgUA>ZJ2a@Tn_nRn!h|!Lod4@Try0GP=sO{9lcDBo3x4<2~iO^ z80v|kY(`Pz=247+MMK{LpCw*Gn^zuaEUpSRB<4!sg-vvH(ec+R;?>Z1Y`P^JJzYwm zMN91ua|EsnhSftd^sw{>Db0e$2kshI;gG1)%fiy=D~Y;LdUw45VC1X_b(qmgsCBk| zq@;dyxTHXd?>#=PpXl_QKgv;h8+A5LBev=9fYb6F?Xgpq@ z%B&hQMqOlclR~1bb5ji=4H1IIQTgj3TE@goKiuS6kd#}4R5`}b}aJN>WE%jTDDAbJ8D9Hny)|bKMQ`7M>r+z%+ZuEq~+%=ZdTD?efV;Dm# zp|wad;v1~Hilk(X?1v5>r+y+VEX1ApCb&oeCs97B751C?=qJ-ktu7Ls&A^zHxA1Wr zr_xGI9Qu2aw+^b;PlJ(fPS=Iwy>z;;GQ8k@b9y@UJ=tOKbmWLzqp76{7|YgG`|hY~ zEuT5F5#K*D;UiYXNW)CHzF0B{v$z>QTXqlT$fok`;5;*3H+3G>cKkF&zU4-u(8COD zT0}&@G6!#GEF}>O<+Xti)F>Cpxew@7QV*3~H)kt?C>K+be8g}E^qiTl$4fUXCNY>< z>ZQzOnZBIU6tO}^jL+%e)1?$4#s*|^kS)?GT>9DDDGkz{eo&%pmPu%lNod6?N5qi*s?amp0QG9REK{msVlXG&4CqNOd2-OqKkP=GaO~sHr^1u%mE(^ zSi@NKG?^B~M@;GDo9~C%F>aIUfk6}H#H?51*ad}eO;1pmcf*?{l1cO6U-14R?k;w6 zT8#Mk6mu8%avnX*c$A6BFO<@&ZjJM>m+~>0md80Q)-KpwD#Z&=Fg&p7>~y8VydN6I zx=nfA9EB_Fy$Vp`%`Bd@p3&D4EULX98oR&NWZp;j+62uUK>F6cbM?bbQ9he zr`Ow4-jJIflbarwo1*=D0>4t(Dj?Y>A-+r+g0GQID3i?S$kL|jGjfxDxk*0Jo`rMo zPS<3=g(b`q@et{4x#v8hM`u=EvIE@8$Rla*K*x=4`sWm=E1&(YOwqqM`iS>r^mIYL z&pC%FG4ypgCT$-E_U!8qOpu0Tg79wC+3hQ&Ay7Fc>g<7)(gWdXJ%pau*793~&Z@#m zMALg!(de;Nh2x3t8Sph@r2cPkw76D-7qc#}m2?XI0iJ4ekj3v+63!Z1!RTaS)PdMu zz)&Ziu3BD{%L|BvF$Z~P4>^J$R(weoLGVG^W1=z+CyTYmN3e0ehz+9;tdgFBCJ>3n zAE<(G6X{j_N+$r{AH(@027K5n2jFsXty=y1fYl_YiR#{fvy}MbkUge0UU7nK|H`Ef zwVYzI*m1(84JHYvd6uJ=ous}g6Nyi&;Y<=+Kh3+b;!CpSV`{ZyaSDm?ZU5c!K;|fa ze4Hq8D(QBme20s0$UhNWeAjPrDRJ)TIWQJ`Ym_T%ManC5Jn_ZD%Ul}%!vJ^!6V*8$;!j-aFR7Iim(<2z0unEu`Ii&x|IsoZ zWZ#VrrRG<#m)5Fdf0H%B?=s)6FuvtuD1mZWD+pA6=dq`x>GivHl)2$}`<}f(6cr?} zM`8Hw*Q8(pD(-S8P6(l;jEAB4%{zO{XiS@=7i3fE*O@cYuJe)zd~b{bQNBiDxWUiY zRuUCX8wD6ELg7})24(k3;R;EBKC`H@#A50bW3B&rvhYZOzfY79C4g;>+m;&rr!)w4 zEI()+$Y#JS>^OGN9E2D2q4gEFIVwVp9x+`6nDT7Y;vc+0b9&@@d?bzEyHXhSw9J6n zP?y)Z)mFSI%AxUfIYO^nvAjwPb?j@2As)P&B)!gxKzwtcm+R@kFf3$Fgw5@eNr8D! zy{9CVGl`#8D>2YOEh-J(v62&2Pmgg%bhcdl2a5Xv3g};mD)i>6)HuA?IMK^_@b7#qgT^l8HY923O z@;?;6`yZBy%EuppY0AXEErZjvy-ku79sw@DAgQdwSny!+H zkqEzmi8JZ9fWG&?Lq%eG!i*=scua#$ zn@~J%{Ykt; zg)kb-K4P8VA7fY`hn?zqVn+hrp8nenV6d7ggfP8Iq)OjoYE~3 zpyzJ4I$pVy4^V|EMSjOx&Mwz44`c?d;QYj^Q-M67NNJT!1DbiwJok|0kS4d#{F|hR zR;=dn1?ycjaVK7}hG!av*w@lnV&RvVR*BiE%7}IHI5DDgH*{m#4`yc5>>mwHua{`L z5XWQRKr{HDV_AwZnCLcgY*w+I#?t7T5;p}F&t`e?XgXle7D+8_@vji~Ryevva+&Zd zlV6iXZX2{hG}{HJ+#{*%Kv#+!Sed?frk6zRpe244mx?iutx}5OevI)wGGB$)nC{#v z8H{+1>8dScx4fKEAB0{C-YKVSG(YcF3TUQcx<)eQ3^7rAn9eaO3QQHEIn4L~2VYz? ze=>C+WZ#G8`eShOeJH_?L(Vo_EnP6O-K`15+#uu--U65K&r7tsGZiB-G5bDDL)_26 zbeI)1a5U*pincrrQJdT*g|P?2Z+NAl7Zt#7NveXlXJvUV#y=f0y0E5@C^18b>L$z! z3Ybv`_{t1Fh~uT_)Q0EblWiEbI|NT}ayx2Xz+!ebt$k7OpI=X3)>PNn%3k199_G#U zN7#Z!d83Eh^mT;l+nX?+p?c|0!f1XO8n&ZRdz49{Hm>j5L@N_!5bwj z>d&{*zedB!+LZ9W%L!L;uTyr=glxZa7=BD%C8_v_2rsYjnc?D2Db#@ei~5A0bpxIo zUP-S2$z(dsH;%YBucZV}Y$`k4x~P7+!{oD+qcp?HKoN&2GT(;NAZ6T2lZ@ydgXsX6 zWW>@FF|UZZp6|*_0u!&_rXzlE?t0yMEX=F3$tc0!>DD4Tb=#|U3gSDr7z`5 z= z!!O}nP-)X#MuO={MExJ=-6^Reen3>RANwQp@5F`mvjEn|(d5{)-5mvpF0m9*T-T^WxUTFjCsqyLFaw$clN2fiw4TF+luM_jV45Fh*1(>J@!+!IO(_h6=4YRf)Ed3wnp@8% zgJRG+iZEh5OM%pz6c8Kj)}(}+v4|!-$HgOcS1%-+g6DUq+7)~u9R+u&kuIbJ3QN-? z286}zP(UR}#>gZEGr^LR6@hhv?UZv<6}U}YE%E9!jt5_}nN(F;Q%o;mho{Q~iJ1yq zA}pkmrQk~oQ@5Rnoo4*PATjd}gG+*IEHeLLK$_~9~%>XClr1AIs=-2M=%_EB^` ztzdl!HH4-JDjvd!{Ad|9#%qe90ikA$p**^pkKtpH>ukxCaB;bM$&~(?^U{rom#-gj zoB|C_+FDu0MOi%og!|np0c|IwT&$2ON8>5_G06frGhqjBx!?VxU{u|%xYlM!nNR6k z3Y7;$tDdMA;3~mG)WPzbR<8j2Dj)tu2D~X0q;24$t28e}l5m@c&fR#^dsrh}+$(u3 zO-MW4c@`s)vIBnyUqFdV*t)VQOiN+qZnrUf886o@hlh5fU%P^eI(_VhN%@`E&Wow} zDk*QldM@Ryekorqk2`J+<=<7?#X4Ea)7CR7w?cQPTWPrG&wNhV;FoB7khzUZdviM% zI`yW%knYVK$5qnZArm5Q4M_KWvRI&WZJQ6x_|W1b{-y(h9JlXUHme`yLiCtChP1~~ z)Gg5Yh!jQ@S6Y`W3&=ne`X{*1KPh*D_1#qHIs8pji#+`o(%<8k{$6C>pEitV{yZ!H zudV9nm;H>;$*O=+`xlD27@wkf4Ej22}SD1u_yDvD4L6#QigIFVA3qoN|HaMT|a zP*9XnMOiB1{0oYJ;zCex04^*pw*2oINmIb*c_qE~-0$r5O?@pgkfWcgi}10&P8M^$ zDrWu$KGyThn?RaPTCHa@ZurKAKaXwYb#~x+=ydQ0Q1N}k$d>S3rsHOo`GOu=xIW3e zaA_pP@D@*%fzwLElaUN#FVVJ`ozAahW_x7&$4_?W*MdamUX|It z3uN|<+Ps|KinLw!tLzTQ?Cjsg@2K3Q!1q0#47&Nc`cCy@ama*zV+kG)uIkfQ%l!dk zD-uflQGT0#kZpeslGj6WF*qz2gP+eGrM_QUEC#>gy<7}_i!KI7)WEPe@!`~BG5A9* z21S30#UO{RSr)On{yKlyx&CImmPMR({}`Kj;nrhvGxwZ`4s1RVQ7P>781J@|@o7)V z`D{OPZu!0c#*LscQ>RT*=fT9Ys@R1F6ISKh>v<=$OP1jH)6fWgk{Qb*2{)KbN))1- zO|j#s#U%I41e4q|Tj7;jRTA+Eya1DCIruD!~-d5-AuvsRx!v;|7^VXPb zS(o^;jUEJbxyBTQSk-DcozG(vR_hfcY?24Z0+Tp6Cblt2wj4B1wqT_(v}NHHk=)!O zlVa(RV*IM*TD-VBU3W_yH?DmNYr95oM@nTN0j01AClI^0wllE< z59(QLW|#J6bFJoT&ki(19Ch{%NY$fr;na@&NgO-0!X(*s&Po#>NZhduKj{kA z5b0!U*5FnhEb80MIj8?*G(YiB+K<`2Im8G-0!?9Ir7eUO)sXZtdV_o?G zo1}TWnWSx06)3l~jdJ#o!?~F$2nJG56Pv#gXW(iRn+INL>*QYO0X}9qQ?R!Q3tNuQj<7PlfEX_6^RNjM-M@C(;`uFO_W-xX6-L$Mfv~}8~L#A@eYiQBz=&~ zfb$B6pg?nVV!Xm6n1z>Jg={!CXs8?juB%NKU>07(%K{$2unQIRTHcbAwA|tBs+EyY zQmvec-jOD8Ffa6sYHlf|8Nko3_R+D{f~1N|)O^>onXf=HbOSrEGSW6YmRARYzi}v7 zOrnK!T%vWOsv4|YZ(_f{0tVK2xZ3ImePI6tmbF&**(RzK2z@mf?eWq`Z;F01p7Fuo zQOlT$+16S2B~Qa6-Wwe>-!1$@Sk!W@$XnId6`KF{g{vbz^PMKxHVb>~tm*9NT0JxA zE?KcZ@!PQ`wxbHEs{WElD-E5PP zzb8}V!$n+(#b~`x4aoatML)iMToV)sb zq%Rfe9gjpiel`NKjK(4kqYn-o!9=S@JEz2#phVvaF1=a4df;xAJZ-@aVTRhicuF`1ulIhkLG zC6IG@g`CTQ7g^SNJHQYI|FOW?gF%xAM@dZ1;LSXWVNSBC$@AaIeSg>C3|< z#UEho8|0S8b@QZYhGU~FJYNENOYnQ-CfUK(*JXAEZ?M`8dbsnO7o@oPJc@5|ic`ey zEGSlLIa^F@#L@DAG5;NQXoH@IlVi$8aF*XQu_Z5#bo$?y)s1QlLU+dcfvW2N*wbqx zIXR7TsM@#2dZf5g+Ny4o3EdyEB^z~TFzF-Yj>(G9dfP8lUf0Jg^;I~7-*H|c{kwRf zh|%{6OWUNAl26YoRN`(m;_aVdNafUn(Z?0SVDP4SKWE>*7V+p`@E2Tkk@Y2e>(xkR z!B_Hu81;MbJ38u9zQ!N1@msuCZeuCUBr%NliM>ou{6-DfJRB)si{y^m-@GtlMMTem z@x_Ni{0M_w>AMRIkHqgWF2%m|gPO%ZM(cEtm$V*g(y=-nl65*PtI$I$`3dnoBgLJ6 zmJdXoe!=f(ot(eo4>^mtf>)rP`)Nx%iJ#T*A=2;q z`d;JUh&JhzDN%Ky_cY=->z?o#o?1!?ZU5qTw7My0@kgv``3Q*odL+PRzNsg;4QBBP zbfbq1tf{}Es_&3$t;oo}T_0%+-;T)}A|%OdR?$o>taL*p)0JR8_gs)?HM78GI6_Qh z13u6l71kuP*x6jV`FxJLH`y$YyA`viOdLO^p0m1(i;Lkt9DaB<>+a+fyjOCE*6i$t zNT5%uSq+6WvpBo??dGV_Na<{Ri}r!R)%7E9nleU9bg0BhPP5uxtS+-yjdI*<{KiNS z(n(%Qlh2C`abgK3r>hd-#Nzas&mW(D@qsZbgUx&=l97^}*_=K-zyh0a(?Q@EPBRcR z3oV1p93+tk_v8?-4;M-!Zgj30Y6f{CjgY~#GG^qnhc-ogm)Z)N>!exRn3b?nR@hgB zy2#!3JQ07fSsd@IB{HcC2Jl;Sr?*@^j>yNY+Ji!+=I_83ZP9&gI;yu7@@-8UDKEi<Pg*-V2_os^8HI z)A}j`mrDYn8i=IfBBMVmdslZE2bx)3dl;#C2C>pNBks^(vpA0EL(mueI07A&D;0sO z6oH}4_AUrqBMDp^B`}+g%0@q0bg`?RM@9J%!DVM!D(g|n0hL3co zZLIvxHxBil#0I<_ab@T?@&O^-GFWd?G{!3$6WE%~kr&c#QIBtxkHfby{e5sMZ)fw~ zisUEWA)k^v;cFz4UNPN#jwiabyUgM`$akrp)5cHI5@#R@zy0Ym`RInS5@elsvox5` zIcK3T>V`Snj0*r%M5*Y4Ywta;3+(rum(~3;E50eqtmde!tPgUUV@ZTis6cg--P zf6rXpu3VgCTdc|#f55Wek6Z*(_@-@oZepWc(lWNP%nxAPT-3a(bF8GV}->!$d{cXkpG%8Y$a>cCw@G62kb__(p)Q&rx z!m+G=JXT-N30Bew7W7HBW4oU3JS_)nvr7o?88fR#0{vgS5sW6+S!URw!`{H6=7+%& z-FvJ?i>SWeWMPvR>cnlfL>VXYD8r@0o`mH)bu&zZN*iICRM5)8c5c@***v)Xa@wsR z+QP3bqB_rPjCeXH;f2gzw_q!kksHhFZx}OmJWPfYlcR;PH5VpD7AB*$D2#)xo)k(5 zX|B`@lu1vs$T=R-h{M7r?ZB$)w6FsZ3~=XtNu^eo1&blnU)`Y37sGNb(QA=AY*M-< zx@i)N*fa}#tae)@+}>{ycY|}pyD`fH$VaO5ShFos zY8RBm^Kww1-C!D39jg+d8+-B2kB8ZDh%E3!6*U)*^S@B2~g-Swe4#g=J4kai!>` zv1av^BaZjkY3Ep`NnI`A`|&wOx}iw0D-Kn08ffqCidK(Ue_E?$EjsjK`#y@4FTcf> zJf=B7bYMXUp`Oo)58bqKb!cgb$A`8dKJ@m$qR_lOJV5lyHi1=zGPX40C7PG+=RvRE zxaY|1-{&kg&EEq;fv1BFwm^AKgEjCi+jufK5Tf4XQ^832so*?IpjFPyUjqd>GY@%d zm!|A{Ik(BYE%ms!w)cu$JRRHnQv8=#y0z0hCtL#LAAG`rWn*P?C#R6YB*{RIyH9#_B*N)H`SFogUFb6= zvzhSqV$&goR%^N|g=IIDJCjlsBixHQ_?v|&S}5%jNh;sRjyIL(WkLWQwJ4Q$ay>&97HX9lnXKw4JP!x> zKQ7jKnl0H#5ZrxAN;;f^EItai5IGP!VchycQdR>0GSRgrPv%4N*_opVEE<*x+yyM_ zk8;-)Z6r@WHlqt8kd;^q!NG?+0C!s{YH5C3j<;^ep}E+*e* zZn7jInkfE9r>4-Ut=COWO?9x+f7;nt_h~h^rTDe0`wtv58S#!G(U{8)OsjFRebZ`m zl8G196Rv~W%4qp=wsaot&SFOohMld`vNfeA`UrnP?@L{NU)po2II;w_t6`kZqqF9~ zM5=LT;e2C8A?#i9{K+sCQl6Vji&*`<1RtAsaSaStS=wKhYlUDNeWlUSygOHcKb|d2&DZS_QSt@*V}9ShMsH~|EHSWj(;4mBH|yS2Fhs2-NacVHbWSbvADci(s>qdU19MyJg*C`F@~xHhcP&Sjl82K+cgkG z#*YJUPy}M{)4$(knhT!ew&yuh2RB<7*7LC9%uv%7wnkS<4dv{i?9d%Gfn?YUDIafT99}-V>*A!II{>K`OxanJ{i@F^?8L5eCnG#H%c4V)(Ns%ItP_m9L5d!nTa+=S^NKX<*-Rzs5`H%&@|6hhJA5u-ZYpS7F$Wl?$Ne z*}#ql@?Ay*en(|p&?NX`W=#-gIy+8Y5=w@Bj+z<;TUbebO}GYTIpTcGO+4gWNP%5P zv`n~~zK_2I$GXK@qj77GSSwGGK}*7o2%M9b4|9*qEeXW14YtZPdHxS$#ZTR?76oOn z>)ye-w(spqgRu_Z=A$b6xx082^H80z*bxl;q}|+-lwS?qFz$#i4mPmM`e}BUdNdaX z3xj5b#g0(Og4GAVdFo%q%sf0W)RAGBTTE2jJ~2@T^{uY%uX(=3s=szjp2MEHzh&XV z2V{u#(hj{7OTOb(LkT0A_XjmVqoN#Tl%oHLBz(`U)Le&H_TF}m;re0q6{6AoB#EEP z=h9&WB4k@&V*SePUE-^(R(mYj_TSE}w)c0otHSOvG_m<@+B*6lNw z6$g%)G70-3UnQ)6$&uvzTf9~yNxatdWBi$D4-1S&w7>~=QKdc0cCwkO{}d~`rzYK` z`A_p7Zq{@H1r59)|#D9)nbij82hi zIP!u_KrU8#AFey|l0qX_OQ1pfktBI1CgqVhN$ zQR;pAfw&M-<8~Ay?usYwb{kmQmw8UGWI64N;HpBeI$X16 z$TvBe?ASlyU>&SSqCLvH(vb~?cgZ)6uDf~=EyfvM?YJ9V!8TMkfoG=znT zv>c|j~Qkuqt2}_0l$}&@ zFP&`5u`nXIcIV~8+R{<;_h73#+kMHfXc0AoKdox^%!zP%xL526LJdXj6MFNRAx2Uk zIbI4cW$uIaHee=K9khGL_QglMkd?wR>2l@oqXtjq`fu$gyCkW9jL-l{$TKiHB*6^m zK6G&P;C|hQAgazFsXT6jt&5nE`MLQT%(~w`X!q2?#6^s9ZsLNeXN8H2aQZt`{RT9UgW_odu5q3t1(Tar6C_dmI}Qn9$5M~zxJCRS{`8 z3)@DaQFsK@P-!pC2EWD4%{V%)8NJ*l2+bJRT!M^#eXLF4zF4fCS!3C%L-x#zVKdY` z_4OO^y}U%G{wMAQhHuhMd<=?_H(sq&6WG2};cPR3B@ru`?(i5Uv#Prsjtul6oEG!@ zHLj=0Q+Sc&Hsyl}5v!kFA@jbyyQcr|umr?Myfwint)_uA3f9 zlX92X3RE&@9j3MtyGKv!&Y5wGf;t6qb0V=Z46V{!cdOr5V$q6zq|b`wAUqVS1%%3^ z>{HYYaVmG63A@r--_Kh^&WG%L%{7Omo=$hVAAmER)CV!x;|@G|2)2GIIg=f!?497` zmPTs+J}g@?G>=_2!;zEn2p{TdLr#B`O`qZL7CaVL$hd7ibz#dKa+%EGn;DLTy2s@R z04vn;1WIFnQVoxoEe>}{toqop2q|1o$y#4IGVWrN{Iu!?XuIgo;I~vnvoGNmB&rc- z^P{zQY0EO|(X)s9S(r6F?sm3@EfQ~z=rLjWOoy?`xeQ-L*KBoE(3h($ahQS|V|7It z#p^wB0>q*EidZoMFR^dy99cb9;)y(dc~_%9aJA~&lOJ-LKT2MMBw{^;VL1F3SClOj zlK5BTcIyu$8mF}sQ%dIZBx^?st*v2Z=3ia z$NeGSuT_;mSe*wyQVH8>uI(aWw)11|y-E}_8VgR-cc^3)nrA1Q|6Mz`Zx^2mqE$ap zb^TP*p%v7c!;uOG9kownx%a4Nzx#XCG7!Sf4sQ*p*tveku#Ia-MvWv_G zZ4HN6)=5V=6#OavU3JfUi>t1#4=P7NV@4MTwZflSgSns$!fJkPF33y#RhB*fHyP~j z2ujgi1pE74M)7N6yAVe(@u*A|hAsHsynG!tOe)!5JefD({u@ug!{IDf5qPxs;K5Mr z`A2?Me2hJQ%2DJwuIiXuR6K0>h}t`+-!&ts<)2`CPdV~}CuQ37QwIKRF=9NIJs?^H zzv@eZTJ~ucI_(IQpNYLMm+$L&`jWEZvY_UKF%&OGPLJXq1KZ;NeS2x4v+S1Bj+}gr za~)g0N`rlr$bv7#o$8T?(a5%(c4Qe%Mt0z|!)G)b*}tb9qyX&ab3b;16@Bir>{e`U ztAaqCvXp`aIg$*y{PLk%64=zm{RV=`m8=_kiWuSp5q~M!hzq@745{d8X*Q#pa)Nh= zAebq}xM?M#%E66)Yo1EXpJ>#zRAX%MdB80@CoRpW#=WG)Y%5y-36D=}Uv+-{fgy*z z{6bxjEuj|?cnLd98=bV#MH}6;(L)=(v@xAFlI4xQMQ{#L)}u={zWZkR6!^fr9{&5d z%mf!tVIu84Y+y4c`rXE#aLWO2+Ws?Nn833CMILm?uj0AKm2Ac-cY7G!Eiex9afvF2{mS16%i*$+LW_-|Q+L zFnDPH>f)-Jp>ueg#Pas-we)=UbX~}6fcq#J>HN>-clZ;`1GR$QZ2nYR*w{x3rP^Mq zgi@C&p;TWbltL878YNomCq-+S{b8#Z$uJCH&uov7&I7rq>m2c-br9s9Jc`6%DK>Kr zxj-Uvg$4SXYjwAYTqz4-ze-8jhDxz1xmrB;7=6Ro&S^GcycV%zrolDBa1@U3b5I8v zp>nEKIgOM_Y@?8bZ{vuHbe)CGcu&t-xI3wpF?Td;`ZyA@jIrFS`RU#M<#%U1Sf?}? zrBXdkfBHlCSX>EVBFzP>{MhfAC*_w?+cB2bIv)~3ymmhl|5{jvf|B)7)pn1`wzDrd zSGb(F(88APiiCJj?(|GY$0wp>xP>Y z*~;!IvLE9#K2b^A)cB;+6x~}C-CNn@dcV8NZ7si)_iO9zQoQQ9BmQl3+ukW(`|n}{ zc1C=CXUISGI-VL5*HSHMCKuZZ3&wiYXD|-FTXuZj@9}(w&kXl=P&env!0WTtZ22O8QW8DJ7Rt(wCCUDXF2PA0_=M89>QEN(NCf zn35rsTtUf|lw3v0P)e?*L{5>Nj)WZQ!$&-})my$)4JVnXVlsrSpVoH`!vXqi%DS3{PWt1$Z% zDA_{E+myUR$-9)iN6Gt?d_c+nC~2f*D<#_~`H+&2DA`WQ$CT`#WG5xNDEWkvPbt|= z$!C;&PRSRPd`Zbyl{gfP_AD`ZAPD3DAs`pX1M-0|Pyn<63W2sj5l{@20Hr_~P!2?Zc0hZe1JDtu04jk_ zz(v5tKxd!}&=u$gQ~}+A9zai^8t4UF0`vy@0G9%n0eykXff}G6&>t883Iy6POO%1}4)6f* zAn*_{7kC($2h0Z^0UiY&0~P=a0R}t{JOMlj{1;dRJOw-rJOeBSmH&d?*Z^zzn zun+hK_!ig?900xpz6X8)egqBzhk(PtPr%Q>FTk(BZ@>}Ycc2M43j6{53H$~84g3Qf Y1C9eHfRn%};52Xs_}8$SoHhLLe>~#FzyJUM delta 22624 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 diff --git a/BIN/HTTPGET.S.txt b/BIN/HTTPGET.S.txt index f810571c..f046e45b 100644 --- a/BIN/HTTPGET.S.txt +++ b/BIN/HTTPGET.S.txt @@ -15,7 +15,7 @@ AUTO 4,1 .INB INC/NET.HTTP.I *-------------------------------------- RESP.BUFSIZE .EQ 1024 -TIMEOUT.MAX .EQ 100 10 sec. +TIMEOUT.MAX .EQ 200 20 sec. *-------------------------------------- .DUMMY .OR ZPBIN @@ -24,10 +24,13 @@ ZPIPCfgPtr .BS 2 ZPHostPtr .BS 2 ZPPtr .BS 2 ZPReqBufPtr .BS 2 + ZPReqBufLen .BS 2 ZPEncodedBufPtr .BS 2 ZPEncodedBufLen .BS 2 ZPRespBufPtr .BS 2 + +hSocket .BS 1 ZS.END .ED *-------------------------------------- @@ -56,9 +59,9 @@ L.SA.REMOTE.AD .DA SA.REMOTE+S.SOCKADDR.ADDR L.MSG.IPKO .DA MSG.IPKO L.MSG.USAGE .DA MSG.USAGE L.MSG.UNKNOWN .DA MSG.UNKNOWN -L.MSG.HOSTOK .DA MSG.HOSTOK +L.MSG.CONNECT .DA MSG.CONNECT L.MSG.SKTKO .DA MSG.SKTKO -L.MSG.SKTOK .DA MSG.SKTOK +L.MSG.CONNECTED .DA MSG.CONNECTED L.MSG.SKTERR .DA MSG.SKTERR L.MSG.IOERR .DA MSG.IOERR L.HTTP.GET1 .DA HTTP.GET1 @@ -85,11 +88,13 @@ CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? CS.RUN.IPOK ldy #S.IPCFG.IP+3 ldx #3 + .1 lda (ZPIPCfgPtr),y sta SA.LOCAL+S.SOCKADDR.ADDR,x dey dex bpl .1 + >INC.G ArgIndex >SYSCALL ArgV bcs .9 @@ -110,6 +115,7 @@ CS.RUN.IPOK ldy #S.IPCFG.IP+3 >LDYA L.MSG.UNKNOWN >SYSCALL printf bra CS.RUN.ESYN + .9 >PUSHBI 0 >LDYA L.MSG.USAGE >SYSCALL printf @@ -121,39 +127,49 @@ CS.RUN.RTS rts CS.RUN.HOSTOK >INC.G ArgIndex >SYSCALL ArgV bcc .10 + jmp CS.RUN.PORTOK + .10 >STYA ZPPtr lda (ZPPtr) cmp #'-' beq .1 + >LDYA ZPPtr >SYSCALL atoi bcs CS.RUN.RTS + >STYA SA.REMOTE+S.SOCKADDR.PORT >INC.G ArgIndex >SYSCALL ArgV bcs .8 + >STYA ZPPtr lda (ZPPtr) cmp #'-' bne CS.RUN.ESYN + .1 ldy #1 lda (ZPPtr),y cmp #'U' bne .2 + >INC.G ArgIndex >SYSCALL ArgV + .9 bcs CS.RUN.ESYN >STYA ZPReqBufPtr >SYSCALL strlen >STYA ZPReqBufLen .8 bra CS.RUN.PORTOK + .2 cmp #'F' bne CS.RUN.ESYN >INC.G ArgIndex >SYSCALL ArgV bcs CS.RUN.RTS + pha >PUSHWZ Aux type >PUSHBI S.FI.T.TXT @@ -161,51 +177,75 @@ CS.RUN.HOSTOK >INC.G ArgIndex pla >SYSCALL LoadTxtFile bcs .9 + >STYA ZPReqBufLen txa >STA.G hReqBuf >SYSCALL GetMemPtr >STYA ZPReqBufPtr + CS.RUN.PORTOK >PUSHW ZPHostPtr >PUSHW SA.REMOTE+S.SOCKADDR.PORT ldx #3 + .1 >PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x dex bpl .1 + >PUSHBI 8 - >LDYA L.MSG.HOSTOK + >LDYA L.MSG.CONNECT >SYSCALL printf - + CS.RUN.OPENSKT >PUSHBI 0 no protocol lda #S.SOCKET.T.STREAM >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 - >STA.G hSocket - pha + sta hSocket + >PUSHW L.SA.LOCAL - pla + lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind - bcc .2 -.9 >LDYA L.MSG.SKTKO + bcc .1 + +.9 pha + >LDYA L.MSG.SKTKO >SYSCALL puts - lda #E.SYN + pla sec - rts -.2 >PUSHW L.SA.REMOTE - >LDA.G hSocket +.99 rts + +.1 jsr Init.Timeout + +.2 >SLEEP + + >PUSHW L.SA.REMOTE + lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect - bcs .9 - >LDYA L.MSG.SKTOK + bcc .3 + + cmp #ERR.SKT.NOCONN + bne .9 + + jsr Wait.Timeout + bcc .2 + lda #ERR.SKT.NOCONN + bra .9 + +.3 >LDYA L.MSG.CONNECTED >SYSCALL puts + >LDYAI RESP.BUFSIZE >SYSCALL getmem - bcs .9 + bcs .99 + >STYA ZPRespBufPtr txa >STA.G hRespBuf + >SLEEP + CS.RUN.GET jsr CS.RUN.ENCODE bcs .99 * >PUSHW ZPEncodedBufLen @@ -213,6 +253,7 @@ CS.RUN.GET jsr CS.RUN.ENCODE * ldy #S.PS.hStdOut * lda (pPs),y * >SYSCALL fwrite + jsr CS.RUN.REQUEST bcs .99 @@ -323,28 +364,21 @@ CS.RUN.ADDTOBUF sta (ZPPtr) .8 rts *-------------------------------------- CS.RUN.REQUEST jsr Init.Timeout -.10 >PUSHWI HTTP.GET1.LEN + + >PUSHWI HTTP.GET1.LEN >PUSHW L.HTTP.GET1 - jsr .8 - bcc .1 - inc - bne .99 - >SLEEP - jsr Wait.TimeOut - bcc .10 -.99 lda #MLI.E.IO - sec - rts + bcs .99 -.1 >PUSHW ZPEncodedBufLen + >PUSHW ZPEncodedBufLen >PUSHW ZPEncodedBufPtr jsr .8 bcs .9 + >PUSHWI HTTP.GET2.LEN >PUSHW L.HTTP.GET2 jsr .8 - bcs .9 +.99 bcs .9 >LDYA ZPHostPtr >SYSCALL strlen @@ -356,7 +390,10 @@ CS.RUN.REQUEST jsr Init.Timeout >PUSHWI HTTP.GET3.LEN >PUSHW L.HTTP.GET3 -.8 >LDA.G hSocket +.8 lda #'!' + >SYSCALL putchar + + lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Write .9 rts *-------------------------------------- @@ -365,17 +402,18 @@ CS.RUN.RESPONSE jsr Init.Timeout .1 >SLEEP >PUSHWI RESP.BUFSIZE >PUSHW ZPRespBufPtr - >LDA.G hSocket + + lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Read bcc .2 - - tay + + cmp #E.NODATA bne .8 - >LDA.G bResponse - bne .81 + jsr Wait.Timeout - bcs .99 + bcs .80 bra .1 + .2 >PUSHYA len >PUSHW ZPRespBufPtr ldy #S.PS.hStdOut @@ -385,15 +423,18 @@ CS.RUN.RESPONSE jsr Init.Timeout >INC.G bResponse bra .1 + .8 cmp #MLI.E.IO SKT Close ? bne .9 + .80 >LDA.G bResponse beq .99 + .81 clc rts + .99 lda #MLI.E.IO .9 sec - rts *-------------------------------------- CS.DOEVENT lda (pEvent) @@ -405,7 +446,7 @@ CS.DOEVENT lda (pEvent) .9 sec do not discard TIMER event rts *-------------------------------------- -CS.QUIT >LDA.G hSocket +CS.QUIT lda hSocket beq .1 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown @@ -443,9 +484,9 @@ MSG.USAGE .AS "Usage : HTTPGET [port]\r\n" .AS " -U Url\r\n" .AZ " -F UrlFile\r\n" MSG.UNKNOWN .AZ "%s: Unknown host\r\n" -MSG.HOSTOK .AZ "Connecting to %d.%d.%d.%d:%D (%s)..." +MSG.CONNECT .AZ "Connecting to %d.%d.%d.%d:%D (%s)..." MSG.SKTKO .AZ "Failed to Open Socket." -MSG.SKTOK .AZ "Connected." +MSG.CONNECTED .AZ "Connected." MSG.SKTERR .AZ "Socket Error : $%h\r\n" MSG.IOERR .AZ "I/O Error : $%h\r\n" *-------------------------------------- @@ -485,7 +526,6 @@ hReqBuf .BS 1 hEncodedBuf .BS 1 hRespBuf .BS 1 bResponse .BS 1 -hSocket .BS 1 TimeOut .BS 1 DS.END .ED diff --git a/BIN/TELNET.S.txt b/BIN/TELNET.S.txt index 5f9eae6d..cb55415b 100644 --- a/BIN/TELNET.S.txt +++ b/BIN/TELNET.S.txt @@ -11,7 +11,7 @@ NEW .INB INC/LIBTCPIP.I .INB INC/NET.TELNET.I *-------------------------------------- -TIMEOUT.MAX .EQ 100 10 sec. +TIMEOUT.MAX .EQ 200 20 sec. BUFSIZE .EQ 256 *-------------------------------------- .DUMMY @@ -70,11 +70,13 @@ CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi CS.RUN.IPOK + >LDYA L.MSG.IPKO >SYSCALL puts lda #E.SYN sec rts + CS.RUN.IPOK ldy #S.PS.ARGC lda (pPs),y cmp #1 @@ -86,16 +88,18 @@ CS.RUN.IPOK ldy #S.PS.ARGC dey dex bpl .1 + lda #TIMEOUT.MAX sta TimeOut -.2 >PUSHW L.SA.REMOTE.AD +.2 >SLEEP + + >PUSHW L.SA.REMOTE.AD lda #1 >SYSCALL ArgV >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc CS.RUN.HOSTOK - >SLEEP lda TimeOut bne .2 @@ -106,6 +110,7 @@ CS.RUN.IPOK ldy #S.PS.ARGC >LDYA L.MSG.UNKNOWN >SYSCALL printf bra .99 + .9 >LDYA L.MSG.USAGE >SYSCALL puts @@ -118,15 +123,18 @@ CS.RUN.HOSTOK lda #2 bcs CS.RUN.PORTOK >SYSCALL atoi >STYA SA.REMOTE+S.SOCKADDR.PORT + CS.RUN.PORTOK lda #1 >SYSCALL ArgV >PUSHYA >PUSHW SA.REMOTE+S.SOCKADDR.PORT ldx #3 + .1 >PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x dex bpl .1 + >PUSHBI 8 >LDYA L.MSG.HOSTOK >SYSCALL printf @@ -142,21 +150,40 @@ CS.RUN.OPENSKT >PUSHBI 0 no protocol lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcc .2 -.9 >LDYA L.MSG.SKTKO + +.9 pha + >LDYA L.MSG.SKTKO >SYSCALL puts - lda #E.SYN + pla sec - rts -.2 >PUSHW L.SA.REMOTE +.99 rts + +.2 lda #TIMEOUT.MAX + sta TimeOut + +.3 >SLEEP + + >PUSHW L.SA.REMOTE lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect - bcs .9 + bcc CS.RUN.LOOP + + cmp #ERR.SKT.NOCONN + bne .9 + + lda TimeOut + bne .3 + + lda #ERR.SKT.NOCONN + bra .9 + >PUSHBI 0 >LDYA L.MSG.SKTOK >SYSCALL printf >LDYAI BUFSIZE >SYSCALL getmem - bcs .9 + bcs .99 + >STYA ZPBufPtr stx hBuf @@ -193,10 +220,12 @@ CS.RUN.LOOP >SLEEP lda (pPs),y >SYSCALL fread .11 bcs CS.RUN.IOERR + .3 >STYA ZPBufLen lda (ZPBufPtr) - cmp #$14 Ctrl-T + cmp #$14 Ctrl-T beq CS.RUN.USER + >PUSHW ZPBufLen >PUSHW ZPBufPtr lda hSocket @@ -241,12 +270,17 @@ CS.QUIT lda hSocket beq .1 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown + .1 lda hBuf beq .2 + >SYSCALL freemem + .2 lda hLIBTCPIP beq .8 + >SYSCALL UnloadLib + .8 clc rts *-------------------------------------- diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 05fa7710..e397acfa 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -63,6 +63,7 @@ LIBTCPIP.GetTable .EQ 62 ERR.SKT.OOS .EQ $BF ERR.SKT.BUSY .EQ $BE ERR.SKT.BAD .EQ $BD +ERR.SKT.NOCONN .EQ $BC ERR.DNS.PENDING .EQ $B9 ERR.DNS.ERROR .EQ $B8 diff --git a/LIB/LIBTCPIP.S.FRM.txt b/LIB/LIBTCPIP.S.FRM.txt index 75cef98b..d6541501 100644 --- a/LIB/LIBTCPIP.S.FRM.txt +++ b/LIB/LIBTCPIP.S.FRM.txt @@ -131,14 +131,17 @@ FRM.NewIP stx .8+1 FRM.SendIP php ldx #3 Copy SRC.IP even if IP offload ldy #S.IP.SRC+3 for proper UDP/TCP CRC calculation + .1 lda IPCFG+S.IPCFG.IP,x sta (ZPFrameOutPtr),y dey dex bpl .1 + lda IPCFG+S.NETCFG.DevFlags and #S.DCB.NIC.FLAGS.IPOFFLOAD bne .21 + ldy #S.IP.TOTAL.LENGTH+1 lda ZPFrameOutLen sec @@ -159,7 +162,9 @@ FRM.SendIP php clc ldy #S.IP.V.IHL.DSCP.ECN + ldx #10 10 words for IP Header + .2 lda (ZPFrameOutPtr),y adc IP.CHECKSUM sta IP.CHECKSUM @@ -171,6 +176,7 @@ FRM.SendIP php iny dex bne .2 + ldy #S.IP.HDR.CHECKSUM lda IP.CHECKSUM adc #0 @@ -186,10 +192,13 @@ FRM.SendIP php lda (ZPFrameOutPtr),y cmp #S.IP.PROTOCOL.TCP bne .3 + jsr IP.ComputeTCPChecksum bra .5 + .3 cmp #S.IP.PROTOCOL.UDP bne .4 + lda ZPFrameOutLen sec sbc #S.IP @@ -201,17 +210,22 @@ FRM.SendIP php sta (ZPFrameOutPtr),y jsr IP.ComputeUDPChecksum bra .5 + .4 cmp #S.IP.PROTOCOL.ICMP bne .5 + jsr IP.ComputeICMPChecksum + .5 lda IPCFG+S.NETCFG.DevFlags and #S.DCB.NIC.FLAGS.ARPOFFLOAD bne .6 jsr IP.SetDestMAC bcs FRM.Queue + .6 jsr FRM.Send bcs FRM.Queue + jsr FRM.Discard plp @@ -219,7 +233,8 @@ FRM.SendIP php rts *-------------------------------------- FRM.Queue plp - bcs .9 DONT queue + bcs FRM.Discard DONT queue + ldy hFrameOut no hFrame, cannot queue for retry beq FRM.Discard.9 @@ -227,7 +242,9 @@ FRM.Queue plp inx cpx #K.FRMQUEUE.SIZE bne .1 + ldx #0 + .1 cpx FRM.QUEUE.Tail beq FRM.Discard CS ldy FRM.QUEUE.Head @@ -247,8 +264,10 @@ FRM.Queue plp *-------------------------------------- FRM.Discard lda hFrameOut beq FRM.Discard.9 + >SYSCALL2 FreeMem stz hFrameOut + FRM.Discard.9 sec rts *-------------------------------------- @@ -292,10 +311,12 @@ FRM.Retry ldx FRM.QUEUE.Tail .8 rts *-------------------------------------- FRM.Send ldx #3 + .1 lda ZPFrameOutPtr,x Get Frame Ptr & Len sta IOCTL+S.IOCTL.BUFPTR,x dex bpl .1 + FRM.Send.IOCTL >PUSHW L.IOCTL >PUSHBI IOCTL.WRITE lda IPCFG+S.NETCFG.DevID diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index ef2c6603..fe4049ff 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -172,28 +172,52 @@ SKT.connect >SYSCALL2 GetMemPtr lda (ZPPtrSKT),y tax jmp (J.SKT.connect,x) + SKT.connect.RAW SKT.connect.DGRAM jmp SKT.SetRemAddr + SKT.connect.STREAM SKT.connect.SEQPACKET - jsr SKT.SetRemAddr + ldy #S.SOCKET.TCP.S + lda (ZPPtrSKT),y + beq .1 + + cmp #S.SOCKET.TCP.S.ESTBLSH + beq .8 + bcs .9 + + cmp #S.SOCKET.TCP.S.OPENED + beq .2 + + cmp #S.SOCKET.TCP.S.SYNSENT + beq .3 + bra .9 + +.1 jsr SKT.SetRemAddr jsr SKT.NewTCB bcs SKT.listen.RTS -* lda #S.SOCKET.TCP.S.OPENED -* jsr SKT.StoreTCB.S + lda #S.SOCKET.TCP.S.OPENED + jsr SKT.StoreTCB.S - lda #S.TCP.OPTIONS.SYN +.2 lda #S.TCP.OPTIONS.SYN jsr TCP.OUT.SendOptA Send SYN - bcs .9 failed ARP lookup.... - + bcs .3 + lda #S.SOCKET.TCP.S.SYNSENT - jmp SKT.StoreTCB.S + jsr SKT.StoreTCB.S + +.3 lda #ERR.SKT.NOCONN + sec + rts + +.8 clc + rts .9 lda #ERR.SKT.BAD sec - clc +.99 rts */-------------------------------------- * # Listen * Listen for connections on a socket @@ -945,6 +969,7 @@ SKT.Send.STREAM lda #ERR.SKT.BAD SKT.Send.9 rts *-------------------------------------- SKT.Send.SEQPACKET + bra * >LDYA ZPDataInLen jsr TCP.NewFrame bcs SKT.Send.9 @@ -1030,13 +1055,21 @@ SKT.CheckStream ldy #S.SOCKET.T ldy #S.SOCKET.TCP.S lda (ZPPtrSKT),y + cmp #S.SOCKET.TCP.S.ESTBLSH + beq .8 + bcc .90 + cmp #S.SOCKET.TCP.S.CLWAIT - bcc .8 ESTBLSH or less bne .91 more than CLWAIT + .8 lda #0 clc rts +.90 lda #ERR.SKT.NOCONN + sec + rts + .91 lda #MLI.E.IO sec rts @@ -1067,35 +1100,45 @@ SKT.PullhFDDataInPtrLen rts *-------------------------------------- SKT.PullLocAddr >PULLW ZPTmpPtr1 + ldy #S.SOCKADDR-1 + .1 lda (ZPTmpPtr1),y sta SKT.LOC.ADDR,y dey bpl .1 + rts *-------------------------------------- SKT.PullRemAddr >PULLW ZPTmpPtr1 + ldy #S.SOCKADDR-1 + .1 lda (ZPTmpPtr1),y sta SKT.REM.ADDR,y dey bpl .1 + rts *-------------------------------------- SKT.SetLocAddr ldy #S.SOCKET.LOC.PORT+1 + .1 lda SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y sta (ZPPtrSKT),y dey cpy #S.SOCKET.LOC.ADDR bcs .1 + rts *-------------------------------------- SKT.SetRemAddr ldy #S.SOCKET.REM.PORT+1 + .1 lda SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y sta (ZPPtrSKT),y dey cpy #S.SOCKET.REM.ADDR bcs .1 + rts *-------------------------------------- * SKT.REM.ADDR = Incoming Frame SRC @@ -1257,6 +1300,7 @@ SKT.NewTCB ldx #S.SOCKET.TCP.INSEQNUM sta SKT.Cache+S.SOCKET.TCP.OUTNEXTSEQ,x dex bpl .2 + * clc .9 rts *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 89af46e6..60598660 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -225,9 +225,10 @@ TCP.IN.JMP.ESTBLSH lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK jsr TCP.SetSocketTCPO FIN received, Send FIN.ACK * jsr TCP.OUT.SendOptA -.8* jsr TCP.OUT Send ACK as soon as possible +.8 clc rts + .9 sec rts *-------------------------------------- @@ -497,15 +498,19 @@ TCP.OUT.Send ldy #S.TCP.OPTIONS sta (ZPFrameOutPtr),y bit #S.TCP.OPTIONS.ACK beq .2 + ldx #3 ldy #S.TCP.ACKNUM+3 + .1 lda SKT.Cache+S.SOCKET.TCP.INSEQNUM,x sta (ZPFrameOutPtr),y dey dex bpl .1 + .2 ldx #3 ldy #S.TCP.SEQNUM+3 + .3 lda SKT.Cache+S.SOCKET.TCP.OUTNEXTSEQ,x sta (ZPFrameOutPtr),y dey @@ -513,6 +518,7 @@ TCP.OUT.Send ldy #S.TCP.OPTIONS bpl .3 sec DONT Queue if fail + jsr FRM.SendIP bcs TCP.OUT.Send.9 ldy #S.SOCKET.TCP.O