From 005c2ee1c6744cd73a0682071efee615e1cd0c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 1 Nov 2018 09:53:47 +0100 Subject: [PATCH] Kernel 0.9.2 --- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/DNSINFO.S.txt | 29 ++- BIN/TELNET.S.txt | 44 ++-- LIB/LIBTCPIP.S.DNS.txt | 14 +- LIB/LIBTCPIP.S.SKT.txt | 433 +++++++++++++++++++-------------------- LIB/LIBTCPIP.S.TCP.txt | 49 ++--- LIB/LIBTCPIP.S.txt | 20 +- SBIN/GETTY.S.txt | 1 + SBIN/TELNETD.S.txt | 48 +++-- SYS/KERNEL.S.IO.txt | 38 +++- SYS/KERNEL.S.MEM.txt | 14 +- 12 files changed, 359 insertions(+), 331 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index d7d1f0ba52c2246041964757c128729f5c504566..abdb71360c9a9533350102aff3ed24cdcff1b530 100644 GIT binary patch delta 8503 zcmZuX3t$t+vGLotvGR z-JO}8nTyRf!DgG_`ADHykzE+Q=Z}i#6)UqNBKAyG>Y)=Gv1g^+DTp|-Q~9Sbl0Gsw z>K;E9Q6O*zNB0|_>6ZX91#$v_7YxhD@b7uyy zD2NG70@3ESKO082@A>dIKPIb=OnpB&2b%e3^OR)Op3N72m1yhn64Jk|hXRr4cDyID zQ;0HG?V0q|;~CkPtsP$kGGEsOB1{71{Q}u~YF|fzaDm4CJ^WW3J#TQ{k=%>lD9EHe z`aUz6bYy*>DQx~Bf79LFQo_DKDVmq$87~m%kl&-ieVxyC1Ksl<#{E&y!EMY*>1)@B z)?;WNMYxj*EBZ~MCvEr51T-V*FbeBKC<%q_Q4gnRZ}_3_LpS^UTFz#G-kECHOZ^RfE0pDCB#t# zw?E1H0Kw6k9D)i zS1s^-@2U$nd`Vy(361ZX$3Rx`uN07rNgMxp0l9*794i@18Yop&uSwkeIkFvlejI6} z$q~N2n4AO6cg5s7^5n7l67rY($jyA*Bt;;KeCTg)5_RL~Ur2Hx;8KWsk-T{96-1Hb z4`%jt{LB9@&KzuJ1)JG@wP;nJCz%^Qec1ipY0+~USxbM{tY#OI{~$>Y0a%qo6{iBK+8!yd?ipHcR?#k+TTP>x{DK^+k<8&Q z=1@9ll)2PTpm{x)T0rI;JC{p+pn-Ou0fx{HO`$H4Do|^K)r744|CWJ>HvZc(svMd! zqb#Y*2o$RLaphELj-%I;Ci+ext1M~<5utdK*d@@-1ON}4@d3h1+p!(x)O-z4I6aFJ z6ji;*act{sDgut5|LGiRKRKDtnM>)WOz*S(6HV_!ll!F8{m^-nIs=CQ!dU%qY}Ug< ztoIZsBVK+75lA>$tj4I{pfY~jT*^vz@E7M&kH^@0+MoDxKM^Akt{CLtOXpD^1LxcG zs41}QlKIqe*z>@Asvnr2UO@Fk%;|IVpY6ZXpUr==ka{w5^W_zn3kT=mA3tglRYq>$ z=P#ljLzDcro~mAJ@1jfdFFAVEezm`+H_)5o&+)JE&+^ap^WH_&9R9>2O5Lzib4P1+ zzly}oNNW|+owS#2wKF?UYHkaWP9+Rpmj^Bjw~cX8+-r=>W**KG@-gDM0i&b=)USmk zFWXH961u6tTrrvrs2tI(^CBX;fMljj@{biV$yAx-I~A?J$K#tWf`7T18om6y(U}I= zHqZBLLi0kR1m}fBv7zBC^E@3Y(tFZ7ESg1v+G}ZPV0?24cTsX_ASf?5=8I2yCtHp37ob`DvS5$0Mg4Y5scfvEAK)nGO?(v z+aO(Xn~^vRISXLDt~`U4JI|+BsN$!~jcyAPmmu{17$l7mzcosFu)a=(u?4!f#i8TK zmdnxQjf!&diriP0H-?qFYmm59o-;B=954oyE*p2w=w61zr)B7=Y}An}mh<9jI+;Ii zq2dj3xo9ZIla5y8dPa5B1a5ch12+W1TLWwYO5cfC=_dGcb7gLbau9tkTEWMx0TP)@ zsC05AU%rG&O{&b@@&n|IwZ%CTY|+kSTZA*U>l|Odgj(1TT^@)y!AfwxEz#vxM}^VB z+!rcHa5gAB>FkF+@I1bKnf>X;3gh>XlI_dwD;gOimQjCSMl?UiGu*9gx*P~Uu)J*r zdN=35vbLw8vHcSSR+&TwM_#G_ta3ivD1tW z*692VmLRv0HS&XII%Tx87>{Xgn$Zdr+52R~Y5c6E)EIIa|ME1&ghl6!z7sa-mU}xA z?P&K2BlnTfMRNaR6n}y~`PZBO5?_-W7axTfnCi;x|WMG^#62JVM*Q}+|=iR4NCT?KhQaoJZ z*uaQi8v_MFPA&@77JD+d4UA*I(eaK^+!U1NgC2J00xaG6^8S1LkJnO} zRB{3T&RQy~0f;U}Kg##a_ra-kSNL3{{Cudtk4t4-1eeCRhmVU_kMHiT;7(TT-o$V( zGGI6_F^-oR$19BERcu*b<$EGgPQFLs>NHqgzcp9|y7Oyei_^Fh9Lr-aV)sEK_ba3L zQc$=T(I?S(=h7H?&r%t_SxH&g9Ju z_%6r8Y+vIxGAOyADFL+>99Y=4$T@^}K6#fwHe1Av%$pX0>fFemt%p@dvi!Yzst~sY z>!{SkO^lQR2K?!Zj1=#(0j2^lSKd+NmPE3ykil~iET_iq;fdF2DO*rDX+u{yd(Gkl zXW5j5$6iY-7`=BLrA6R1K0Z*>wiLS+G;J*G{1zl`MGw3Tf9;MUWx=$uZ5C}^l-<%q z`ImeKbG`tNNqQ|IRdx|?TCDiERp{sh4~?uqhXdEz1MAw(+NTMHUN+wr*eVowS#A^K zgXfF<@_#FqSYBeVR6d`R02jWQ@%3L&NM9pM0eI*8j#&rTzm?}4lb;^>`5qIx1daqR zfh^g5|5_ec8;|j^cNHn*v;4F%$|Nd=<)__Mq>(;;`CY~6*i^PXjZKjh{f%iXm&)=# zUQcP&1IA_(cKxD{7uHjm73r)agVhQ#PPNxmpU!gW;5SY687!B<`c6uNf>umt>xda6 z%_g6i5$XxaUQ>6Nq(mF}Z-HjR>>^uuH!0C*Vv%ep@Fu$0lZft&^TdiVY#>5jq9cZd zU58;&dj`{gK_gL4Vkn&nAa@4Sn8CCZf!4M#3`}UrWZIr;nZvZrY+1o*tp;m*Iy02P z1m<*QGQqtz*=GQ(YYt<7s%yn`#y+#Fi0OVm$X5w`n&<$~J zOlNFvYuik$;B8MG-9V+$$wIiR*J%MX1H|wBpN46hDCsMRWXd;DsSu@fXf)q}257`E zZ9p%Ni_<=X{%8OI*2|ly$HD}JN$_2psL_gL8;~$+$<@H7+_#QxN>m9w#Wg zM_;5=i4AX(1ffw7#27RY?a11h^=6hM>rhr-R;-R7+*%}#M$Ua86Zdu&=wgib6y9m` zH>jHqBn3T<8zC_Z$%4E7YOreC&eZ+jP}|u$9bVf${J@|!{|#D=L5Yu|t&-7r`!1>| zEY$yC7nM@@c9v6%=q^vVivR}#Y}^1z0m$|X_OIM&NK6mip=#lWd*7f|XZ_H7W@_^p zX)ne%SVh2o3s#}EuC06Kg;ne8))V~pH>foScT?lvJg9!#w?HdsH3UttxAyVfanMj@pyM>!VZijlWO`Pu z)gc>9+f#-C-HegLZ8HbJHiR)+b4!s{$n~1);=pirLQ8-pp&LB=tpY`+vu%}iVekR~ zKl)ZtFfV9l66IgoFDYwN0veOIraowM(m(x6ZC?Zjul_%_XBASMivKcI{``kjZt;Mz z{EAUZ0Q0^sU_W6BMUJ*exYe#1VFZScKGk_*oJv92^*UevodPv@ja-M(MK~|R@p!b` zYwSxK4;#_niak++y7Q2+xdz<&F0IuSCd_X9ossMM58U@3;2wE^D-fL)V<6TCF~_Z4 z^3J)wGgx=ESd4Jf$OR{3O3lNvoS$)iM-Qvnt0b}sw_4`9NXkiABJ zF0JK1x=tlVtrkXu2!i(W>cDdTD}cm3Zu;K&r+C?xoqP(Z%#3mwvF|@*bcJ^ceEAJ3 zi{G|Zsh!jmhB`|@^59C`2qNX`!v`wcs!&m(C(Rb)jJrRGMUxE(8IZ+b{*d>QN;J!b zuUG5CLJ8pzCVFMC5Y_n((_HO45ii}c3h|xq$^$J7AlHMVSbiobCLHcvLFKJEc$3O& z=%%EZLX@{gQV1Gv&FOa-2?D8j>823rt;weXYM}@Wf(m3w+2Rofl5#bGQ6OCyWut_6 znD8zmMfy%?rJML()mr;6u+ly_F_~fRe=r1IiI^AW0+WEtf$0xs{ncs`w6GH?-7ym7 zB81VfzcGTgxq6qjF6B^dbG6o5Yi;jidMd?!rnjo;*F`N6KX)oAN4VL9lf z^*#I>>y&BwOUx{gMJ4tyv;0ipv5sY?;Y*B^Jlw+o2xN82L_ztgmnvX z!MPfnep%yN{_PcZ2F>z&@*CgrZ=Y^|Tzt!qlV+p6+_X=-rovuPyN0nd1{C+PoLsv` zAk%N*7iZF?kQl#_Nxu{!n+-R!&&88bD%-IJL~kS4%KL2ST^`)$-W9OVVi=289ma}E z7FMlfVV@N&>@&@xE0YCmshZ|$uu7a=;1~e*zWo|jf$LZWmSRhMWcRNIwICpC!P=`> z3j&N72x>v#Q7yP8Yr!=}ro~-{uwB-IuNmprU#+vyM)or)o?!y9d8}M_k)nv*(rOE+0reLGtXPy za&QbC(*Tt($E-dFu6P|h>r@Wa(Vit;b@aI4$g;Dzgaasi6) z628-Qv=rV=NH^gc>A!%a^R7HAE;*g)P#><{@|(V%vpr|+{rLG-KmLIe`GZT1VvjdH zRyeay6L5XZiBYs@?&I2N_pCl~HotxXT}-~rzdM0WA!qWxn?R3;W^e+X-tcn22_3+t zH|`hEn|aw8Rg0L*9;I^xYF==Eo3LQG+=W^Hy8lD?orYh}S^PZRk4v-afSUU??feU* zO|i$JJgW}SxR3vWw)(76;{+eh=M1n65nrMo?X|Ciy4Oga&kAy(Wa3zwpS9+*Vs@hm>ozB!Yt&TWc ztF4b@o5+6q6FZ)iz4%SWeS?pFicW2~Fx69t{F8z_P}@{bhDd>Hn$1zHNV03@a3pq3 z1a?g$*bP{@15>g4MKJM(YeXn&Ho;n=@n(0?Y%mCgK|XAJa3B=JWrNeFK6s)J3q4^% zK7_K>R%aMo`$kU+zULJq&8A0?@h)TC@FZ@BcnJp!5SZeC^?u;WM{iSpnaZsS zR&7@Yn>A3ky)0P49GS~|&Ge{nD9P^~;CMdWOg{$he}S1cl;AS`WiIuy5av~A5}Do~^@MYmM< zoPM?LXS!eO{;nI)jp)ksmHI~$uNoa3#8bM5k{ox94h|2pp$we;bX+LTMw%`(PuJvk z=HRRJ%WhgaYrc+5q0|f)7eQW7i`Yc(h1Tcwpw_oTWuh=3#=l)nr_BSRI!shA#CgwP z7CCs7hV7QgtwW+d2nEXSF-Xh~C15o8kRSnGwU|y@34{uOkk;B9 zipeh8FG2iv1|J7Vl;pjLdmzy*mlF5fIY`V6rjz&4T%>$<`N8T?p4{M^G7%?>1mCcj z9{tSsW2YML!P4&mc(R;_x+s~>*dU#P2Xr!JI?fuHhi8R`c-MlQgTR9pdSL;OYP*D~ zw8>(FQJiv41jMGWLxDHU8+F@z?7bZqyXn9)e3qL|FYxP}<6-qp^dTwSd?*V?_;QvR zB#kyygp-84#ssd(d{8hhq`Dbs(f(@mF=JKE`^?Fz`<&%sAX zO&CE;M3v}m-C^B1-S6~&(0`)u(<$}Y`lq{$5w*v?>~#{jD5AMOGqjt!!Mn++AE zf6wpzSdkwKNQIaloVDHzW-~8cH7X$zG++`)@5u?CDF|`!4~n!fteQ@N-@lm7%m~@Q zt9PNMHH57rpuz@*k5>dbXBX4idoL*dURLzPlhs8F7cR-JCB|%?Het>J%hmUs_U!;@wkkqcD7ZoaXLvCvD8}(828G0-CmAsp%GHYwrPqRMA zQtGzly^-h5k1ZHI{zv0$i-(I-OXifkSaP^TJz?>LqZ6i-9-J__^sUm|vXZj-WgE(V zTJ~1i{<2TX&X!#-J7=73tTe_NS7+B|ugzYceJp!Z#XA-IjDoSd;_32l%Pq!O_PFs+ z#`ZOa_Y6aZyeW&O{A^0|l>JlOQ$CvV`IPm=FBHF8e6YBvq^M*f{OU`$mhLP4c_~4( zKgUQhoXd!|W}$6)=!V{-7=8{y)XxB(DV{e5QbNZ{$l4YoE5mtyXh@OXaK8p#%0V5I z?mA)o1$$C+2NFFNLKqh6C*c=VP)eDkgXk~VjVXFiaLI?V3OcSwim_5m%rMZL4 z8j*ss^L5_4g3cNze^G+iZElPFR#1B9x4`Er%^lZkTmu82s+wrDMlZy6HZaYWgTo3H z+!C?;>1gHHBO2-xl6rD0oac83|4ft1OIMH2E-qb-vNy?PyhR&V{%{SNil(hzjaH(K zFRXl_ZWUUy?u8An6r#}oqkxRH&ux660vTt_t-x~-{5`R$em#DV9$&etcFp&weAB0j k^}urix#ON<$35kadtp27h3~kh+Ho&p$36AIdy(7!4|v`r5dZ)H delta 9121 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 diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 35f1901358d09181dc1a1c5f969ffc0da3bbf1fc..437fc3f3d343cd00f6db94c7cb87080b12d135a4 100644 GIT binary patch delta 48227 zcmZ@>cVJaT)}QjVgdW=s%u*d_FmSqyRNI-SKVFxerIOx%M0-F2f1(V^f`0poZmTf?s?}`oOfQu zy$w$1sRd&a_B1>9Iok{3TzkH8=HX$aYmdjEheFr=Q;p&gdy*XHp3e9sn)80mae}tT zk@$Yn$BB&o<+0CmJE)HPze&7#MAD{gHm0D|ht!K&Pc2CI?77~bhbGbz_B`wFNcvaw zt%bKP-=3*~i<7qIphy`NIj2SBd^@m7_MtiWep0E2RcB2~#@i#yPc10++&?um!;#cg zVK;t7N~od)^M5jD%1=WtYFeAB=dzTahf-Qaipexlt54IocE9c! z?a=o3_V+QDt`(P3bMa2CIFc9X?Py=cEQ6l&BGs%kPUF+>*T=3JAyX<_=dlD6&&9>{ zT~mvTna_nE%V#t%Xq~;NKC-fVV^{xjmSPPhMpkTGy__YwDW!8&dt~*h<;)i^-nTAp zt*&fn5N#qcfj_m};c=uU@|Sj7p_Y-zQ{6f>QW=>ZsjX(NB&~QUbu=|un;ULHH!nS{ zuQxI`JgcK0)7ISI%Mw$x{WDtI7FR}k>S~zb(e|?}uZBsa+~N9Ne8cy;XQEHr-`~EO zjr42#Pg~y;85J%s**uyV0p#`vwQxBP*HlKRP;F%m{+q>uA#H#7zS(zdc4Um=H+e^- z?Rl;tbI;rZ$umnB+EasQ=x$%tuxzlh}TiFqxstqQE%jnSufx8!&AmS7i-mVJb2uo`8
?el%9wu|el^r! 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

>$FE5)6zsfW620Kd~-HUPGsBWa-$i9hcxY>T) zjv8(`ZVk8ESyqdiHMdbF-myzh$xi%*L)}QNDBH?L{L&FF-^X0HJEZ9|{|^2}^N76g zohT1Gp>Y@5OS;~Z`*Yp`X+)gETPtNQVtERy{`pYY9ytcf2u=xhN? zM(fb9K15S8-c<5Ov2U;<*2gp>0#*Cu!THucZO6AG2ER26`N1`=T<-O{K1pz|SHjXb zmfZ#J>-3KVF_f2VIiKZs3r(H$k+kwHa4MHtsT;bJt#&|rV!=Kkj8NQI1lT~l6ofoM z6@1K@MsX+rWl70rF*+#=Z01=$mw(ijn72fObamVVT}d!7Bq(*mGw63sU6fbd)YvE? zH6Xb{lu>)NPe!-$!dX#zBn)AUZXmlh@b?*dYyOTj7u*l|oc?ZMqrVVZ&k7qqL|7M` z;27;!^cOBSzegeK40V!>TAFpx`kzR6BlOl5w0k$%NadeZs9;(I-(ASn?0QaI>=?qb?AVLVzV(J*z)Gd%gwj*9p5E`&@ClZ8Ic@l11js;VKQfzxLLnCJ1ooeO^%eL2ctwLaS z-1HA!Bxg>MV3=a;kHH>bX&3WpOI)b~m!KqR#6lYf;&qwa3L++b;PNQdi7kmr2+K); zYAkutq}428k5U8Zilh5VHF9XeP>NXs)M0tO5S%uiQ-7f*BkcD`sKVmK(xN5A9^;`1 zOW(CJmH;hSc%bE1Kp=%C%-q+aA7y)mM0y=E((OK2KCh=&HxT_oz1${LT{Q}!>ZaYy z%TIQtl5R`3Q}?YXDKUk?r7o*d1Sj-CofYwb+9*DU=7I=`!d&%MkvJANoCzjkpeDP{mj&)dFBpdS(-?kco zW*+AEtacTaKnF$ec}4n|Cg_{Y|M>8gtZ$};EO>%zYh3xEU#S^_c4@Oe=#(t~*L=nr zSJvQKSE_-4CWTM)17NOB-1L7&K2@;7XX&Y6#BY#&`g4rmz0;K)H%6Sgd(U_I;+{u( z<_kRSd{;)?i+B#b#AlrE3TnUQi_Ujtwn8~1_cWRVxT)5J>so3Nyo&Tf0q@vE$GoH! z+InB9|nJLVC1B(EJAr;0pp0M8);O$#o{wxF^yqN{wAp#+eLao@|8qD`D z<41P7JQLqTuLAF@*^2#W1p-8VKs|=RO)|3B@`Kx4jyTL<;3Gtr+voDRK9<24y`S*N zR+nccv1a0-n0}iz6LDCd+pNX)g(3qlf^8`>0I5}1!j*&-e6{DMyFL8(TV2VCzmK5@ z-ycZ&DN4tEyR9lju_OxWS~Yz@gt=gP6Xu89Kk+F$TsZ^a-hwQ_uLVo{Rl)2+|IL3wSJT1L8NwIZr)qTdQ-4&;>i7@i%Wv1bj=+D#2SG~3cLIW7 z+)?5{jOOb0zK-hkJxo~Zh~MC94})~>)AoL)c?V#tqY3fCLMOP)(3&%kQ)<>jonvm; z?gZ1C#C&l=aR(E(yAC#Bj6ls^Q$vVTa=48;^f0#z1?4enT2fE4+*)|@0(r9FlS-r@ zdJ{yvmj%rfRWOW&pzz7C;z{}+whY3ocl0tO!KpO__h`N$euOuh87b&Zz(blIEezy2 zyQ`RGuf~7g;mQj75e9|~4B?5}dpr8NJ2&AD|A`DAAkcQY{92G-emlNbkQd^mJ6*Zn zR5gl;%uJK;Lm*w|D9E53*-4lLcV;wKem1{rC!%NN@Yi;_ywDOLMIk=VRW5&8DBm_e z#_lBAL!t=VTFc&LWa3VsTOdsj7FViu~J^gDCM;TiN3L7fx~KnOOLa_ zWydZs^f7yZp^!=O)1Eb2V0b_?YrI@wAR-e~M6=x+U3d} z0~d*7H_i#DE(G6*;Tvc0VprS%Kw$d(PYV2^N!S^pC1VB(CBQ906e5?@pYNkyz6Ax>qYG&+0K5dVyq#h>B*m1#2(S$)$R1F)Z zaG6@7ss>9w8Fl%V+PiFMld!R;@Pnu>ZW(1bm8famaz#z;$DyVbvelRh+$&YD!7gCm zJeHa|P_uXSvFu{p8ovBWSH%*TJrUV-sB0hs@LPm7I_)^blzh5`CIu&_qtjXs4kItL zbSa|jmW(F5hktXWD{JnC<5XkxqR~*_(KKn3BYd-uBFBx$AJ{aw*X0NtpVh!?`zlus zTrWW_ImufvC&UR6TJ=nn#64Rgmf+cH6~{9Ze%Zv6L+28Q;O)0-o&@)Rq!_pgBeW^; zhk=M%(eu@cZdLU{Q`|<=4kPR&mc0F_IWd4CGv5U?<+Ocb77JjqJPLLmXKgP!W^I?b zcd5n22Q7d&AG^3foSFAhT7sj_g3DA-!8CTuHqFb``dlH`CwC9m_hZVg6wGzNeHBUw zcX61MsQ*Biqi39bnLS~jJ^SQO4VamhDRzf3!kPtZx<aUyP1RB zy4sbY{enl%GZAFqm;A)5T|Q6p9Yg{Gw-+SLa6^->;#Ay)1;KSr1>e+#=eI~VZ;3aj z+%v2gj?B=#^2$x#L7sGtE8ETFSDm)7(Eaj7!2|RnKmS3@W$4hb;+2geAR8EF=rFx# zAH3G(;D77aQ)as#QgbqeWdJb*#=WDDg7j2&^_|htD?gt|@S*?@LjVtB2BYGU%JMXUM!JAmj0Bgd>omf;Md%;SbS~b^mRQe5Sm9K*NpT(n4 zVam5Rcf$b%oj8%D{)W%H-W4i&PHqqP^T;IPpD^PE4A=c4sHA+ah|cp8Xar2T__zFj zH@HR*z%53&S-+x6;Iw;{O5k%90uzWZ^N6f8{dMtoM=N?4nNNY0BZZOq)wqh<3h7(s zG2TSkivLUv z4mph9X%{f}=O|r%xtNbH)O>s?<|Fi#nvdVxMVRpiw3qWoe&UU|QTer4$EkroVGEO! zgajAGY=kRW{5PsADGK5#9Ye|JRMK z{2Bj{spdZwbNd%+lNyBk->N&n1HMPSfgiN+c+!Tq$jPK-7`)l#ok(l(qgspqAY<}> zk6w%aA=Uj8(WyA3(|$%xVj}fI=HSWKxH4MX+8XHe)Ch0G0qt5eL$d{Jt&7S z#Uv`!51$Ggi7G-#eBh8P7)r*oCxs$93C<<%bs(ad&$H*VKYLP4uY^m%T_nfzUp3#_ zI{1*QCOt1Az)<3vEYXA;dgXNWZ55wO_^A)LEairt#YUMavePb)@~roHg=ak!Lg`rF z+}qv5GJX8}|GF|lehh&=X3o!&=o`a_&-lr8 zsLto{FagX7SC5NuF>yP~^zyZ}R=T6W$9L6QdAZqvm@MIz%0)XA+m<2gSSZLptF?l@ zP;9oES%^N*(o%WiY%AnTNs9socA<2(x6Ufp3ifD@SN6`b%6an1#;g2ywU*xz%;3vs zTYx3f<6HWCUPVn8RP0Z53#_{2#Ne5-pGC)LW@qKA(Su z?u{>qA|l>Go;=s`z^K?$Z)KV3qb1P7zng3M;)|o%LM8n1dMgm{g>A(grfA{Djg|73 z@|&JU%*rx_4wa*r#Lvue5^pibOK<@Wa|$u_O^WTZjIqwrCjb8fpK`o`7oH$dIdrDA zm0vo?!iO8C@!RKE89GawE{8lr4jG0Xg@Jl!${|Bh2jNB6`#_9tTmhOo{JmC^_6ZLreaYbZ$s6IjcA^Q;Ne*2x4BG~hHm+hMRgr{jkT z8X)X+_`q~0B@rX100G788E?PK%I2NTmZ^0S$mQ^LbFJ3$=Jz0DY*YY5dlC3nRz}1nE!RF=`HCS!l|G#VO$KZZ&5k6d1GfM9Kb}VrGiboveC+qhhv+X;G)fZL!(ug zwI!ND-^L+c4mMe{rK`ESx1SZ9!=FU4xN`+{^5id#Y)9sKJh{orhzFi8P=qPC5lUg6 z{0p|LxdeJoB6#pZq7NEzG{#cZg4V_OsG3@-i)236E*l@d7$e8@Do3uOOYpOv-`Qm4 z0F2ZED&9?9;USe=)4A;z*%iB3QN+C-;IMsV$`GjkyEUq#>Xg;He=f3w7%q=-YIgZ&>o{tSkB^~keLLT{0h%DnIt|* zWui3kl%R<$-nh+jX}>0#NK1MeIbyfrGm02;p5;5XS=no00I;zxwfVfj{)Zi`h!5|3 z;Wz}4{UVl3%F}ir`Ec~>8_=KJ@I6y|EBLYq=~3Z>;efh3jF8-~s?9rvWgTJiYwpU& zChHb{-T#~!p|V>U?676K#rF+b+gc-SEkIl&v%B}USwZbK9%{43>$3(K|MUZR!+}>s z@DVY53vu1b2;yJ&ZYd!nLVaUhQ)JrO?!NvRk!khKGvwz$N5N<$s@+zz5raX#h(HmC zipYHCFC_pUe>;nY;D%?U{0h7J2!Z!bh7W(IsxN=5Yp2#-R6s<}zMJRVtv@=r(2ChfPkR%~dW-SPwp$t6+aiz0d{=Ff_v9uCd>~1%_(Ms8u8%}I zj8z}oME41iPJ}+a(*s8MDdQ;@T6yufQ>3WwcZ^qFXoYy*yb+<~M6ziN(bHFwo=#{N zrQy0mHVqJKtba#@CI11b;%l7B#O#8ZL$LasuNnXNLMv+y%+W^^8O$2PiL8nFzC8|c zWWgw{B19394KA|^v+>D-rf_9-b!~GS+22__>>uJNh95S43z?6-2;rapj_+dQUZ&$8 zj9+rl3h4ALrh9f;Sz}?SmbtfAV{5~B5yc1k;m1d~fcb;?TnY>Q$oOk08~Tr;P!RS1 zWGA60rNiF5_W{T_Oye7tTAr{bgF~1OsW(zE7GT;`FP#tkf}SN^>qR+fH(CYI;<`jxq$C17HOcGPw6*Y|$)D%$Sxf2CpL) z3$0DipDPOvV+)0O{Pv5jf`)<^04KUYg=&gnayWL1N6{2RR~@a^qnOlbpp*z$M5~E_ zMYiPT4h!Un)ZTP_>$rkz4_HA*xm?dUSP)>HyW&+-!hz|lrQ}cyQP${NnL{=55Uf0i0+=&k5 z*6_8LS~&=rf@ln0C#ZIo3>cC%o4<00<>xP7YMF`kC?Ukoa+W<8Q9Hn4{C3Q-_y)VD z6)YEDiM$N8HSw~`tbjIOh9GH?HI8lN8!xj;(%R5#iAoNg_~JHF!9xDnWmf*^MT#78 z0g1@51unA)=`B95G@4n9Z3-N>gu8ZI6-_701aX8d#j|~c`S95ZThghQ$lP+4f;&le zq6$oPDy7&bUCDAH+kAdtH@=zEF38rAx`My7+X|(wM8?sLZ-eHYK@B=Jw zCW0UQ`3@@`-xWjPm|zyblhktrjqO;s8e=WN74XO^_;V5K3J&nfJFURLd6MePh$Kee zR#0DgY(&fYCT4C^nE<^LT_yr-pHd++!J`ByJAsbwol(MdU8EM>zYDXR7ZF!wV^;lQ zN+rHC6*o8Dz0;b~bg4`c%YGT2qszV?#$2 zY%em!E;(0Ap1qI1dzY2v1;T#R@q^&gSaNTe1+K+AdCA!JCl)U5*B^%nZV+o_q}>SK zGkAp+x-F(skt32@lrNdM*rHobGtMPgNcBk^)2du*6gOV2#bWW?7^8kPD zfR#NFkh!pO0yU>(-$Pi&V<-UVxXAQ~%oKb~oIa_KtK=tSvg=oB-E*JhjrV|cJjHwN zu?pP3#>9*DPJNo+c#jp*p5c$&V~tOJR;G(p{|%n)RnL5moA+87BXJdUXjMyI5S!T~ zg9RLcUlfZwkn$4pR97R03hBLoqFB;zDWz4WP{fOu)iQfu(MT|-@)U>VLgCU5JUqIt z$`*G%xtcQbHF+u+K**U1c$~&R5>Pl@UB`Z|!need-pq(rd9hHe0fzUi?P2)j32@wZ zg*9Zf2e9{1bmaxieGK#XP%d=ZM}m1I#ea;26b2DUD*(HNw4!|`GP%v)$+Ii<3wbh* z`SLg?WBgZk4cMgsy2au4M|rq~zQ#KVKDdE*6UU^(?a%Vyb$qKtmA{CijhVo-X?(uF z9q%0dJN0D?^Zi5gZ4yD;J)J$QfFN!`q1$UWBM#;n>-yJXsbCzy*9E4_PgXD!h&L@n z;0I+o`casUd?~=T)eHel!&i}5+D{tqx>^g482d98qraV;J5zb~gI2;!CZR?zKyBq% zAj^ya+6;hOj1%?)Cn1sI7>&W_Sjcej^7nPWo*w7m%}y&d9vHVMGLAm1cGrVeYLbN% zGPz7*8SxI-Cir}(BM(_dJfLDx$z+zE%(D+!X-^umz=KMlM?)ZY+!z>0+#`t}$wtUwylWuW@#O-VxY(jEM- z^_Djc=qdor%$|~;ImfQuhFv1-hcY_TWdEK#%!4ywSbs$laFM*Fhg1-k3HwXkn2&N>D zkqcV_0^U9H4lTFpIkrk^?I%qfA{k*#X4$TimYASv&{H>$@OT0?lq z%G8InU6AU8hz#GRi3|u?OrQ4cb`v{km|(7b4260OX116+bzbN zHzUK~lcL{D;f$h9_h>@Z69FDa;fx~hkP*!K5s{D0Ec}35v@G-lngS2T>4#nyX2JD@ z4E%#VggEhdw@ijY6jbFoGpi)yXXq!X-C8CivNYnB@}KLjj$pZPK0!eDmSP?#M+OqN zwxGrNPFQ>Xu!e799gm22PWswikBa(Jc<>tiYteqnH)_Uj9E27;OyuOip+sN7{mePJ zmZ&%Hz!S+`?_i-PRnLvW|8$GdH~I3W@~2RNSfF9da~!mA=n1D5g?QAV%(p95DeU2E zV{2Bg+7g3e7OrNb;y7tWS@ub+-@8cqb;>P1e$5D9!Rk+Iw8MAd$rr%umn>R=bi9jE z9ST8}4@)aafN~|PdfFbS6yp?b8P|K`@)aAjA{Onlir>1U!^F)ee8mPUe^$JI$~S0` z|2bW`307Xu!wIPOl40Cu)VSRRFNn6&(Bi!)t~%`-;(p0Z0mH)LvD3c1F#iLv5DS7= z^OrFd1!vvSruxI;RFMZczdWy?DEn1)V7|yKs z^Z|LF&V}~12Xz$f3q7e#fe-pQEg$OB^0Bjd^wy-)@`-&~K21I?pXmV&XSx5Pn)0+1 zvB;PGpO%s5B?5Xi$`T4g%|IJ=NdPR3{$TM2d7l!#A+XZ{4E%X^VDm{BEi1P!U{s|y*DT=n8HB4JdKGSDvB zVr(hcp5kJbgQ1f`(4AvQl0Q5bZNfpo$^#OTQ}T^|^nC@?FqE0*<)x-}C_ zPcnW>+Y~pr0)=Ib3N<+W z@ZH=Df00lc@8FlZgXi%zxr1M!tXBuW)*a0J#_pi%#vW!}P&S)6Fcx!!j$XSm8x~}} zzo2V0N8#^)47N|$_9TBy-7BG5n3vfMuS+t#5&}X13xa)x&C>h<2AELCEX!+Z)-~N@ zn_~eO?&T>OO-3rv$URi4NKZx;s8eF_+|p_kAb76$?jcU0qVgW*kwLWzI5gO%Q#5xn zOfFQRRZ${2n}zFhUJ?q_;mE@rEm49>O8=v$I77H&2qzv!=PF&ufb=RQ7Ato@1)%A267 zIP4v>CMud&HOZi?yMGiZsfg+#qe?OKWzqx{7+%MI9Lik3(DpmfGpXjqhA zWl)-4xe7klO4^4d;`irxYH4s4)(K2}?>xO%$7`-O#7l4TVhL@OuQkNx3w%(;x<1Re z-kx*K7}5wfi2BEPR>?+SBhC_>+ck9aNzUzBbr;rbF`$GJ$kSUO9(kCj6hnjrZg@hm z!1ee6mk)bdNFQExgF(3-3MH(;YHpNAD$?Btk|twY9M6 zNYjz-u0KTI2Is;o`?mg&*54k7wt9ZeLm|rfMB(r6z=V><2Aa3}JN3!}Wm*ROU=Qo1 zqtN&w{>^VOegsnux^Z?_N?=shJvPB3mWv+EnD<^3wXPn;vhOphx2wS6iX_yvw#zu- zW%uKQ_->_9RO34eV8k^U1$%xJDs#~*;m5xL!VZvG4=7q0dC(98f8h%TvwmzimNKMl zfJsc%Pn@~+q}22nNGT%TevB6gtdV&oX3_ssdmlo@_%pdJSm5V!=d?R-Ar=*VH|y=N!cEcbfP;FDVTi0q}`f=Y$PkX_IP#?~x_>CSrcf*;3tvxb5XKnt}qUYb(w zUXN^S>sNz;Z*7|-jvli@-M+~T5;{q)S+E6_Ch5qmjF8zB@6)Zj=pdXAsns-j_nn1UkriWb^Kc zfk|^(C)UaSFwb;AhGxJHW!-rrs}k0v(i#D#q@=4)?^L#AmC+HD^4bG4QkFA^f&(8q z%R||7RS3)E=+41;;^bK#aLvE{)Z~c!QknC!I|PGL9jaMob=BFXU{RV_s{X@8U*Qb5?9S$EzV8;6wR1Z2H_+^*$a>PYPGBS-&K<7#s!Zazd}urK`CgeXruq z{-fIMRsW?4DiH!)uy5!_kUID;@h?8te^ZN9rNO`UcekF4S9(j{tyLr6w$Hb|J6YyC zN#ueB-c5ob0`fO`zh?g(7?tKG@V|8bJ3K?rpSf89ZUS1Df9O_+vcNz4@(sD~LEL={ zXE^5rLp+2ZD?cP4Jo0>`>kY%z_px2kVRF!k;HO4(SUsFc=%QBrZ)E&4T@9W5+^(fR z64m)a_qd*woHxX{w|SBKYeRIs%^Qopp=%({AT|>C1%NA=vg%v9GRg~>^_`;4naq@e zc)aZ@m&_`mSOk;R7^X}^5)PP2kicByiNku0s#FOIE2J~rlW$onw?(EGeh0KmfT$NhX$h;Xcvqy|&W+ru& zMYCkp5($c=)zP3+6JE2SByd6=+8BS8GO>m7YP-BvAlaxBU?3>@JRf}W|*2z$!Dw9d1 zPJHww52p@6&J!)g<+^k0MfG`}GqOQvJ84weP8Khw{p@5r2{f5Wj7p4E50%+Q#JYd; zk}&Qk^e;)cs~xTuJjYGz0|=~X?TMfrDhCXoL7+;y znnf96q^DM=-e_PjW&@70ea$hobTt>>G>0)?;mG-c`F+yW0%u>TokP;qWu}s@F4v7f zx>`s@aWO(mS6yZ=>8eap$t!g&NLP#OS{gUa+!ArN$Sli}lg*cESd=f*$AxCpUAtWE z1pH$aufRI>k*=Sex-9NyMt&qA3TqvT3l|>*5? zc$$|R;x(XHxsfVVK#=Q}n-o&kHk&@hw^nsb*STVxY-KxDs)_9A14;OI#$hqPyLE>G zW@?dlkKM-JJ~dhGO?JNk>W=Pn>ZM3YZhxN|Xe)XkUMHmq1;Lv^4zPqICOO%1t%Hh$ zWZnY$;;4-f)t=?vD&AgcL^Mg811n6Y;J5A&Oau5Y96@*?=&THBFjh$2*KX zUgS5dDe%_Op@n5IuHZJsHzO|R%-QXDwC7{q$jmxR_G<^rJ8XAY zSKci}AX-Jng%(#30OyA!OB~S>%`&~bY5_SMdE~nbgrmCwR&))-0JEX<~K8?Q0x1Y zt{QsYss2pfk>w_<{#?<6fhtkj7q|oQ3{?B2{9c`X9_J3CVxsm87F4xgsY+g|1R7HP zwI)5FsD;e>MjhI$3yJ`NsN1nrs{d_MA4Pk=b?T*tvc5|KZ(xXOqB5Tn*I`tp)Fe<~x8k6w-9DcO_lMll+#`=up5H@6 z5t?-Nyv6R>9xu; z;t_c>fhL^gIWji4Z6ZZcR0%QX$}l%I0hE(JfK<7627>gjez0Ap0*hydfC?ukk$6WT zP%ci&B8Ynf1dkp>^eQscIk>Rd}SbpI4$~ zQubq`SE=t=Yzx>H=@i5cE#B-KT6?=cgt(_zH8S6?)3?T4HFBt|S>s#V>!wTs zXsm2QtXFAU$CTD~+;sy~I~D0J7;lc!vphPern&MWIn6qa`#}+#>C5RJLmMpVxrdL% zbP*#C254NuzNV-K^hQ+BqLwCcZzPHcqCkEiFK%=sr(X zU5>P>-IJV%GxuU~beTUu+3r%-T%ylN6AMr4ch6YuD#Ezcp*D#%T_2Mf&bA25A|!G^ zxGdmKhZK6e(?RT;Lp>yEC1LtlFXM7E{Z;N#d;?COA32!c zRyVj#H;7kAly_Sj_24(D!H2JrD>z}z+AWIz?_7fmn}x1bow46ulw4+QRtpv0lK2(y z`tx<_v*&t@DsV$0jD8T@ii3^^QI&Ytx>1cS)ZGUX*K*pnM9`S0XSv_)b4IyMk20o5 zxm}NPhaTlFJ<8pBlzaLgC8FKaswRyRvG1i(Is)Ivzs5(oUyt$tjS`{n<1l)Z2Qi@d zC=vQzO6IrrfuvC)?tL5-(eCBD=N$wpC36qL+%w-{IyO=~M_7B!%uy(NDV`spDZtz3 zUHSy$ZMpkyg(&A<`%c29Qp<~#qQ}qd`WWjt`l%equ?s8xX5jw;qD-p; delta 47295 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 z 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 BSfKy_ diff --git a/BIN/DNSINFO.S.txt b/BIN/DNSINFO.S.txt index 2efe1589..8bc8129f 100644 --- a/BIN/DNSINFO.S.txt +++ b/BIN/DNSINFO.S.txt @@ -37,28 +37,35 @@ L.LIBTCPIP .DA LIBTCPIP L.SSCANF.IP .DA SSCANF.IP L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 +L.MSG.USAGE .DA MSG.USAGE .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib sta hLIBTCPIP -* lda (pPs) -* ora #S.PS.F.EVENT Now accept events -* sta (pPs) clc rts *-------------------------------------- CS.RUN ldy #S.PS.ARGC lda (pPs),y - bne CS.RUN.ADD + cmp #1 + bne .1 jmp CS.RUN.DUMP -*-------------------------------------- -CS.RUN.ADD cmp #2 - beq .1 - jmp .9 -.1 >PUSHEA.G DST.IP+3 +.1 cmp #3 + beq CS.RUN.ADD + + >PUSHBI 0 + >LDYA L.MSG.USAGE + + >SYSCALL printf + + lda #E.SYN + sec + rts +*-------------------------------------- +CS.RUN.ADD >PUSHEA.G DST.IP+3 >PUSHEA.G DST.IP+2 >PUSHEA.G DST.IP+1 >PUSHEA.G DST.IP @@ -152,10 +159,12 @@ CS.QUIT lda hLIBTCPIP *-------------------------------------- CS.END LIBTCPIP .AZ "libtcpip" +hLIBTCPIP .BS 1 SSCANF.IP .AZ "%d.%d.%d.%d" MSG0 .AZ "STS TR.ID Hostname IP Address TTL" MSG1 .AZ "$%h $%H %32s %03d.%03d.%03d.%03d %u\r\n" -hLIBTCPIP .BS 1 +MSG.USAGE .AS "Usage : Add a static entry, DNSINFO \r\n" + .AZ " Dump DNS Cache, DNSINFO \r\n" *-------------------------------------- DS.START DST.IP .BS 4 diff --git a/BIN/TELNET.S.txt b/BIN/TELNET.S.txt index a5d7b30e..d4ab3083 100644 --- a/BIN/TELNET.S.txt +++ b/BIN/TELNET.S.txt @@ -39,7 +39,6 @@ CS.START cld .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SA.LOCAL .DA SA.LOCAL -L.SA.LOCAL.AD .DA SA.LOCAL+S.SOCKADDR.ADDR L.SA.REMOTE .DA SA.REMOTE L.SA.REMOTE.AD .DA SA.REMOTE+S.SOCKADDR.ADDR L.MSG.IPKO .DA MSG.IPKO @@ -75,8 +74,17 @@ CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? CS.RUN.IPOK ldy #S.PS.ARGC lda (pPs),y - - beq .9 + cmp #2 + bcc .9 + + ldy #S.IPCFG.IP+3 + ldx #3 + +.1 lda (ZPIPCfgPtr),y + sta SA.LOCAL+S.SOCKADDR.ADDR,x + dey + dex + bpl .1 jsr Init.Timeout @@ -105,13 +113,10 @@ CS.RUN.IPOK ldy #S.PS.ARGC sec rts -CS.RUN.HOSTOK ldy #S.PS.ARGC - lda (pPs),y - cmp #2 - bcc CS.RUN.PORTOK - - lda #2 +CS.RUN.HOSTOK lda #2 >SYSCALL ArgV + bcs CS.RUN.PORTOK + >SYSCALL atoi >STYA SA.REMOTE+S.SOCKADDR.PORT @@ -152,7 +157,8 @@ CS.RUN.OPENSKT >PUSHBI 0 no protocol .2 >PUSHW L.SA.REMOTE >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect - + bcs .9 + >LDYA L.MSG.SKTOK >SYSCALL puts @@ -164,7 +170,6 @@ CS.RUN.OPENSKT >PUSHBI 0 no protocol >STA.G hBuf CS.RUN.LOOP >SLEEP - >PUSHWI BUFSIZE >PUSHW ZPBufPtr >LDA.G hSocket @@ -179,14 +184,15 @@ CS.RUN.LOOP >SLEEP >PUSHW ZPBufPtr ldy #S.PS.hStdOut lda (pPs),y - >SYSCALL write + >SYSCALL fwrite bcs .11 .2 >PUSHWI BUFSIZE >PUSHW ZPBufPtr ldy #S.PS.hStdIn lda (pPs),y - >SYSCALL read + + >SYSCALL fread bcc .3 tay beq CS.RUN.LOOP no char from STDIN @@ -198,14 +204,20 @@ CS.RUN.LOOP >SLEEP cmp #3 Ctrl-C beq CS.RUN.USER - >PUSHW ZPBufLen +.4 >PUSHW ZPBufLen >PUSHW ZPBufPtr >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Write - bcs CS.RUN.SKTERR + bcc .8 - jmp CS.RUN.LOOP + tay + bne CS.RUN.SKTERR + +* >SLEEP +* bra .4 + +.8 jmp CS.RUN.LOOP .9 lda #0 sec diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 55946718..8022e88d 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -106,8 +106,16 @@ DNS.REQUEST lda hDNSSocket rts *-------------------------------------- DNS.REQUEST.SEND - -* TODO : >PUSHW L.SOCKADDR.DNS1....DNS2 + ldy #3 +.1 lda IPCFG+S.IPCFG.DNS1,y + sta SA.REMOTE+S.SOCKADDR.ADDR,y + dey + bpl .1 + + >LDYAI UDP.PORT.DNS + >STYA SA.REMOTE+S.SOCKADDR.PORT + + >PUSHW L.SA.REMOTE >PUSHW DNS.MSG.LEN >PUSHW L.DNS.MSG @@ -415,7 +423,7 @@ DNS.DecodeMsg sta hFrameIn >SYSCALL GetMemPtr >STYA ZPFrameInPtr - ldy #S.DNS.F+1 + ldy #S.DNS.F lda (ZPFrameInPtr),y and /S.DNS.F.QR beq .9 diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index d8266cfe..f762e0a2 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -16,22 +16,19 @@ AUTO 4,1 * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- -SKT.Socket tax type (RAW,DGRAM,SEQPACKET,STREAM) - +SKT.Socket tax >PULLA get protocol (RAW) - SKT.Socket.I jmp (J.SKT.Socket,x) - -SKT.Socket.RAW ldy #S.SOCKET socket.size + +SKT.Socket.RAW ldy #S.SOCKET bra SKT.Socket.DSOCK SKT.Socket.DGRAM lda #S.IP.PROTOCOL.UDP - ldy #S.SOCKET socket.size + ldy #S.SOCKET bra SKT.Socket.DSOCK SKT.Socket.SEQPACKET lda #S.IP.PROTOCOL.TCP - ldy #S.SOCKET.TCP socket.size - + ldy #S.SOCKET.TCP SKT.Socket.DSOCK stx FD.DSOCK+S.SOCKET.T save type sta FD.DSOCK+S.SOCKET.PROTO ICMP,UDP,TCP @@ -40,27 +37,27 @@ SKT.Socket.DSOCK bcs .9 >STYA ZPTmpPtr1 stx FD.DSOCK+S.FD.DSOCK.HSKT - + jsr SKT.Socket.FindFree bcs .9 ldy #FD.DSOCK.SIZE-1 - + .1 lda FD.DSOCK,y sta (ZPTmpPtr1),y dey bpl .1 - + txa clc .9 rts - + SKT.Socket.STREAM lda #S.IP.PROTOCOL.TCP ldy #S.SOCKET.TCP stx FD.SSOCK+S.SOCKET.T save type - sta FD.SSOCK+S.SOCKET.PROTO ICMP,UDP,TCP + sta FD.SSOCK+S.SOCKET.PROTO lda #0 Y = socket.size >SYSCALL GetMem0 bcs .9 @@ -116,22 +113,21 @@ SKT.Socket.FindFree *\-------------------------------------- SKT.bind >SYSCALL GetMemPtr >STYA ZPPtrSKT - jsr SKT.PullLocAddr - + lda SKT.LOC.ADDR+S.SOCKADDR.PORT bne .1 ldx SKT.LOC.ADDR+S.SOCKADDR.PORT+1 bne .1 - + jsr GetDynPort - + sta SKT.LOC.ADDR+S.SOCKADDR.PORT stx SKT.LOC.ADDR+S.SOCKADDR.PORT+1 - + .1 jsr SKT.FindMatchingLoc bcc .9 - + jsr SKT.SetLocAddr clc @@ -142,7 +138,7 @@ SKT.bind >SYSCALL GetMemPtr rts */-------------------------------------- * # Connect -* Iinitiate a connection on a socket +* Initiate a connection on a socket * ## C * `int connect(hFD fd, const struct sockaddr *addr);` * ## ASM @@ -163,71 +159,27 @@ SKT.connect >SYSCALL GetMemPtr lda (ZPPtrSKT),y tax jmp (J.SKT.connect,x) - SKT.connect.RAW SKT.connect.DGRAM - jsr SKT.SetRemAddr - clc rts - SKT.connect.STREAM - >LDYAI K.TCP.WSIZE - >SYSCALL getmem - bcs SKT.connect.99 - txa - - ldy #S.SOCKET.SQ.hInMem - sta (ZPPtrSKT),y - - >LDYAI K.TCP.WSIZE - >SYSCALL getmem - bcs SKT.connect.99 - txa - - ldy #S.SOCKET.SQ.hOutMem - sta (ZPPtrSKT),y - SKT.connect.SEQPACKET - ldy #S.SOCKET.TCP.S - lda (ZPPtrSKT),y - bne SKT.connect.9 - jsr SKT.SetRemAddr + jsr SKT.NewTCB + bcs SKT.connect.99 - lda #K.TCP.WSIZE - ldy #S.SOCKET.TCP.INFREE - sta (ZPPtrSKT),y - ldy #S.SOCKET.TCP.OUTFREE - sta (ZPPtrSKT),y - - lda /K.TCP.WSIZE - ldy #S.SOCKET.TCP.INFREE - sta (ZPPtrSKT),y - ldy #S.SOCKET.TCP.OUTFREE - sta (ZPPtrSKT),y - - ldy #S.SOCKET.TCP.OUTNEXTSEQ - -.2 lda A2osX.TIMER16-S.SOCKET.TCP.OUTNEXTSEQ,y - sta (ZPPtrSKT),y - iny - cpy #S.SOCKET.TCP.OUTNEXTSEQ+4 - bne .2 - lda #S.TCP.OPTIONS.SYN jsr TCP.OUT.SendOptA Send SYN bcs .9 - ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.SYNSENT - sta (ZPPtrSKT),y + sta SKT.TmpCache+S.SOCKET.TCP.S - clc -.9 rts + jmp SKT.StoreTCB -SKT.connect.9 lda #ERR.SKT.BAD +.9 lda #ERR.SKT.BAD sec SKT.connect.99 rts */-------------------------------------- @@ -358,9 +310,7 @@ SKT.shutdown >SYSCALL GetMemPtr >SYSCALL FreeMem bra .1 -.8 lda #0 - sta (ZPPtrSKT) - clc +.8 clc rts .9 lda #ERR.SKT.BAD @@ -474,7 +424,7 @@ SKT.Write >SYSCALL GetMemPtr ldy #S.SOCKET.TCP.S lda (ZPPtrSKT),y cmp #S.SOCKET.TCP.S.ESTBLSH - bne .91 + bcc .90 Not yet established...no data jsr SKT.AddDataToSktOut will call SKT.GetTCB bcs .90 @@ -509,11 +459,16 @@ SKT.Write >SYSCALL GetMemPtr * CC: A = hMem * CS: A = EC *\-------------------------------------- -SKT.RecvFrom sec +SKT.RecvFrom pha + >PULLW ZPTmpPtr1 addr + pla + + sec .HS 90 BCC SKT.Recv clc - php + php + >SYSCALL GetMemPtr >STYA ZPPtrSKT @@ -544,13 +499,12 @@ SKT.Recv clc tay lda (ZPPtrSKT),y plp - bcc .9 + bcc .9 Exit with CC and A=hFrame + pha >SYSCALL GetMemPtr >STYA ZPFrameInPtr - >PULLW ZPTmpPtr1 addr - ldy #S.IP.SRC .2 lda (ZPFrameInPtr),y @@ -625,41 +579,35 @@ SKT.Send clc >STYA ZPPtrSKT plp + >PULLW ZPDataInPtr + >PULLW ZPDataInLen + bcc .1 jsr SKT.PullRemAddr + jsr SKT.SetRemAddr -.1 >PULLW ZPDataInPtr - >PULLW ZPDataInLen - - ldy #S.SOCKET.T +.1 ldy #S.SOCKET.T lda (ZPPtrSKT),y tax jmp (J.SKT.send,x) *-------------------------------------- SKT.Send.RAW ldy #S.SOCKET.PROTO lda (ZPPtrSKT),y - tax >LDYA ZPDataInLen jsr FRM.NewIP bcs SKT.Send.9 - bra SKT.Send.DGRAM.8 *-------------------------------------- SKT.Send.DGRAM ldx #S.IP.PROTOCOL.UDP >LDYA ZPDataInLen jsr FRM.NewIP bcs SKT.Send.9 - jsr SKT.SetFrameOutTCPUDPPorts - SKT.Send.DGRAM.8 - jsr SKT.SetFrameOutDstIP - jsr SKT.CopyDataInToOut - jmp FRM.SendIP *-------------------------------------- SKT.Send.STREAM lda #ERR.SKT.BAD @@ -685,9 +633,7 @@ SKT.GetTable >LDYA L.SKT.Table * PRIVATE *-------------------------------------- SKT.PullLocAddr >PULLW ZPTmpPtr1 - ldy #S.SOCKADDR-1 - .1 lda (ZPTmpPtr1),y sta SKT.LOC.ADDR,y dey @@ -695,9 +641,7 @@ SKT.PullLocAddr >PULLW ZPTmpPtr1 rts *-------------------------------------- SKT.PullRemAddr >PULLW ZPTmpPtr1 - ldy #S.SOCKADDR-1 - .1 lda (ZPTmpPtr1),y sta SKT.REM.ADDR,y dey @@ -705,7 +649,6 @@ SKT.PullRemAddr >PULLW ZPTmpPtr1 rts *-------------------------------------- SKT.SetLocAddr ldy #S.SOCKET.LOC.ADDR - .1 lda SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y sta (ZPPtrSKT),y iny @@ -714,7 +657,6 @@ SKT.SetLocAddr ldy #S.SOCKET.LOC.ADDR rts *-------------------------------------- SKT.SetRemAddr ldy #S.SOCKET.REM.ADDR - .1 lda SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y sta (ZPPtrSKT),y iny @@ -724,105 +666,118 @@ SKT.SetRemAddr ldy #S.SOCKET.REM.ADDR *-------------------------------------- SKT.FindMatchingLocRem ldx #0 - + .1 lda SKT.TABLE,x beq .8 - + phx >SYSCALL GetMemPtr >STYA ZPTmpPtr1 plx - - ldy #0 - + + ldy #S.SOCKET.AF + lda (ZPTmpPtr1),y + cmp #AF.INET + bne .8 + + ldy #S.SOCKET.LOC.ADDR + .2 lda (ZPTmpPtr1),y bne .4 - + ldy #S.SOCKET.LOC.PORT This Socket is bound to 0.0.0.0,check only LOC port .3 lda (ZPTmpPtr1),y - + .4 cmp SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y bne .8 iny - cpy #S.SOCKET.REM.ADDR + cpy #S.SOCKET.LOC.PORT+2 bne .3 - - lda SKT.REM.ADDR+S.SOCKADDR.ADDR - cmp #$ff FF.FF.FF.FF, Broadcast ? - bne .5 - + ldy #S.SOCKET.O + lda (ZPTmpPtr1),y + and #S.SOCKET.O.ACCEPTCONN + beq .6 + + ldy #S.TCP.OPTIONS Listening, only SYN packet.... + lda (ZPFrameInPtr),y + cmp #S.TCP.OPTIONS.SYN + beq .7 a SYN recieved on a LISTEN socket, ok + bne .8 bad packet for this listening + +.6 lda SKT.REM.ADDR+S.SOCKADDR.ADDR + cmp #$ff FF.FF.FF.FF, Broadcast ? + bne .41 + +* ldy #S.SOCKET.O lda (ZPTmpPtr1),y and #S.SOCKET.O.BROADCAST beq .9 this socket does not accept broadcast ldy #S.SOCKET.REM.PORT Boradcast, check port only + bra .5 + +.41 ldy #S.SOCKET.REM.ADDR .5 lda (ZPTmpPtr1),y cmp SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y - bne .9 wrong remote host, exit.... + bne .8 wrong remote host, exit.... iny cpy #S.SOCKET.REM.PORT+2 bne .5 - >LDYA ZPTmpPtr1 x = SKT.TABLE index +.7 >LDYA ZPTmpPtr1 x = SKT.TABLE index clc rts - + .8 inx cpx #K.SKTTABLE.SIZE bne .1 - + .9 sec - rts *-------------------------------------- SKT.FindMatchingLoc - - ldy #S.SOCKET.LOC.PORT+1 - phy - ldx #0 - + .1 lda SKT.TABLE,x beq .7 - + phx >SYSCALL GetMemPtr >STYA ZPTmpPtr1 plx - - ply - phy - + + ldy #S.SOCKET.AF + lda (ZPTmpPtr1),y + cmp #AF.INET + bne .7 + + ldy #S.SOCKET.LOC.ADDR + .2 lda (ZPTmpPtr1),y cmp SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y bne .7 - dey - cpy #S.SOCKET.LOC.ADDR-1 + iny + cpy #S.SOCKET.LOC.PORT+2 bne .2 - - ply - + >LDYA ZPTmpPtr1 x = SKT.TABLE index clc rts - + .7 inx cpx #K.SKTTABLE.SIZE bne .1 - - ply - + * sec - .9 rts *-------------------------------------- * ZPPtrSKT -> actual socket * A = hSocket or hFrame *-------------------------------------- -SKT.AddToQueueA sta .2+1 +SKT.AddToQueueA pha ldy #S.SOCKET.HQ.HEAD lda (ZPPtrSKT),y tax @@ -830,24 +785,25 @@ SKT.AddToQueueA sta .2+1 cmp #S.SOCKET.HQ.MAX bne .1 lda #0 - + .1 ldy #S.SOCKET.HQ.TAIL cmp (ZPPtrSKT),y beq .9 Queue full!! - + ldy #S.SOCKET.HQ.HEAD sta (ZPPtrSKT),y txa clc adc #S.SOCKET.HQ tay - -.2 lda #$ff + + pla sta (ZPPtrSKT),y clc rts - -.9 sec + +.9 pla dicard hFrame +* sec rts *-------------------------------------- * From TCP.IN @@ -860,7 +816,7 @@ SKT.AddDataToSktIn lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1 sbc ZPDataInLen+1 bcc .9 Not enough room in Q - + ldy #S.TCP.SEQNUM+3 ldx #3 @@ -870,7 +826,7 @@ SKT.AddDataToSktIn dey dex bpl .10 - + ldy #S.SOCKET.SQ.hInMem lda (ZPPtrSKT),y >SYSCALL GetMemPtr @@ -884,15 +840,15 @@ SKT.AddDataToSktIn lda ZPTmpPtr1+1 adc SKT.TmpCache+S.SOCKET.TCP.INHEAD+1 sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail - + lda ZPDataInLen eor #$FF tax - + lda ZPDataInLen+1 eor #$FF pha - + ldy #0 .1 inx @@ -900,9 +856,9 @@ SKT.AddDataToSktIn pla inc beq .8 - + pha - + .2 lda (ZPDataInPtr),y sta (ZPTmpPtr2) iny @@ -912,7 +868,7 @@ SKT.AddDataToSktIn .3 inc ZPTmpPtr2 bne .4 inc ZPTmpPtr2+1 - + .4 inc SKT.TmpCache+S.SOCKET.TCP.INHEAD bne .1 inc SKT.TmpCache+S.SOCKET.TCP.INHEAD+1 @@ -920,7 +876,7 @@ SKT.AddDataToSktIn cmp /K.TCP.WSIZE bne .1 stz SKT.TmpCache+S.SOCKET.TCP.INHEAD+1 - + lda ZPTmpPtr1 Dst Ptr=Buffer Base sta ZPTmpPtr2 lda ZPTmpPtr1+1 @@ -929,31 +885,31 @@ SKT.AddDataToSktIn .9 sec rts - + .8 lda SKT.TmpCache+S.SOCKET.TCP.INFREE sec sbc ZPDataInLen sta SKT.TmpCache+S.SOCKET.TCP.INFREE - + lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1 sbc ZPDataInLen+1 sta SKT.TmpCache+S.SOCKET.TCP.INFREE+1 - + lda SKT.TmpCache+S.SOCKET.TCP.INUSED clc adc ZPDataInLen sta SKT.TmpCache+S.SOCKET.TCP.INUSED - + lda SKT.TmpCache+S.SOCKET.TCP.INUSED+1 adc ZPDataInLen+1 sta SKT.TmpCache+S.SOCKET.TCP.INUSED+1 - + clc - + lda SKT.TmpCache+S.SOCKET.TCP.INLASTSEQNUM+3 adc ZPDataInLen sta SKT.TmpCache+S.SOCKET.TCP.INLASTSEQNUM+3 - + lda SKT.TmpCache+S.SOCKET.TCP.INLASTSEQNUM+2 adc ZPDataInLen+1 sta SKT.TmpCache+S.SOCKET.TCP.INLASTSEQNUM+2 @@ -993,20 +949,20 @@ SKT.GetDataFromSktIn lda ZPTmpPtr1+1 adc SKT.TmpCache+S.SOCKET.TCP.INTAIL+1 sta ZPTmpPtr2+1 - + lda ZPDataInLen eor #$FF tax - + lda ZPDataInLen+1 eor #$FF pha - + stz ZPTmpPtr3 Reset byte counter stz ZPTmpPtr3+1 - + ldy #0 - + .1 inx Check if room left in dest buffer bne .2 pla @@ -1014,60 +970,60 @@ SKT.GetDataFromSktIn beq .8 pha - + .2 lda SKT.TmpCache+S.SOCKET.TCP.INTAIL eor SKT.TmpCache+S.SOCKET.TCP.INHEAD bne .3 lda SKT.TmpCache+S.SOCKET.TCP.INTAIL+1 eor SKT.TmpCache+S.SOCKET.TCP.INHEAD+1 beq .7 no more data.... - + .3 lda (ZPTmpPtr2) pha - + inc SKT.TmpCache+S.SOCKET.TCP.INTAIL bne .4 - + inc SKT.TmpCache+S.SOCKET.TCP.INTAIL+1 lda SKT.TmpCache+S.SOCKET.TCP.INTAIL+1 cmp /K.TCP.WSIZE bne .4 - + stz SKT.TmpCache+S.SOCKET.TCP.INTAIL+1 lda ZPTmpPtr1 sta ZPTmpPtr2 lda ZPTmpPtr1+1 sta ZPTmpPtr2+1 bra .5 - + .4 inc ZPTmpPtr2 bne .5 inc ZPTmpPtr2+1 - + .5 pla get back data.... - + .6 sta (ZPDataInPtr),y iny bne .61 inc ZPDataInPtr+1 - + .61 inc ZPTmpPtr3 bne .1 inc ZPTmpPtr3+1 - + bra .1 - + .7 pla discard byte counter HI .8 lda ZPTmpPtr3 Do we have transfered something? ora ZPTmpPtr3+1 beq .9 - + lda SKT.TmpCache+S.SOCKET.TCP.INFREE clc adc ZPTmpPtr3 sta SKT.TmpCache+S.SOCKET.TCP.INFREE - + lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1 adc ZPTmpPtr3+1 sta SKT.TmpCache+S.SOCKET.TCP.INFREE+1 @@ -1085,16 +1041,16 @@ SKT.GetDataFromSktIn clc adc ZPTmpPtr3 sta SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM+3 - + lda SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM+2 adc ZPTmpPtr3+1 sta SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM+2 - + bcc .80 inc SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM+1 bne .80 inc SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM - + .80 jsr SKT.StoreTCB ldy #S.SOCKET.TCP.O @@ -1103,11 +1059,10 @@ SKT.GetDataFromSktIn sta (ZPPtrSKT),y jsr TCP.OUT.I SKT.GetTCB already called, Try to ACK read DATA - + >LDYA ZPTmpPtr3 clc rts - .9 * lda #0 NO DATA sec @@ -1138,15 +1093,15 @@ SKT.AddDataToSktOut lda ZPTmpPtr1+1 adc SKT.TmpCache+S.SOCKET.TCP.OUTHEAD+1 sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail - + lda ZPDataInLen eor #$FF tax - + lda ZPDataInLen+1 eor #$FF pha - + ldy #0 .1 inx @@ -1154,9 +1109,9 @@ SKT.AddDataToSktOut pla inc beq .8 - + pha - + .2 lda (ZPDataInPtr),y sta (ZPTmpPtr2) iny @@ -1166,7 +1121,7 @@ SKT.AddDataToSktOut .3 inc ZPTmpPtr2 bne .4 inc ZPTmpPtr2+1 - + .4 inc SKT.TmpCache+S.SOCKET.TCP.OUTHEAD bne .1 inc SKT.TmpCache+S.SOCKET.TCP.OUTHEAD+1 @@ -1174,7 +1129,7 @@ SKT.AddDataToSktOut cmp /K.TCP.WSIZE bne .1 stz SKT.TmpCache+S.SOCKET.TCP.OUTHEAD+1 - + lda ZPTmpPtr1 Dst Ptr=Buffer Base sta ZPTmpPtr2 lda ZPTmpPtr1+1 @@ -1183,7 +1138,7 @@ SKT.AddDataToSktOut .9 sec rts - + .8 lda SKT.TmpCache+S.SOCKET.TCP.OUTFREE sec sbc ZPDataInLen @@ -1191,7 +1146,7 @@ SKT.AddDataToSktOut lda SKT.TmpCache+S.SOCKET.TCP.OUTFREE+1 sbc ZPDataInLen+1 sta SKT.TmpCache+S.SOCKET.TCP.OUTFREE+1 - + lda SKT.TmpCache+S.SOCKET.TCP.OUTUSED clc adc ZPDataInLen @@ -1199,7 +1154,7 @@ SKT.AddDataToSktOut lda SKT.TmpCache+S.SOCKET.TCP.OUTUSED+1 adc ZPDataInLen+1 sta SKT.TmpCache+S.SOCKET.TCP.OUTUSED+1 - + lda SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND clc adc ZPDataInLen @@ -1207,8 +1162,7 @@ SKT.AddDataToSktOut lda SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND+1 adc ZPDataInLen+1 sta SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND+1 - jsr SKT.StoreTCB - rts + jmp SKT.StoreTCB *-------------------------------------- * From TCP.OUT * Src : hOutMem/OUTTAIL @@ -1217,7 +1171,7 @@ SKT.AddDataToSktOut SKT.GetDataFromSktOut ldy #S.SOCKET.SQ.hOutMem lda (ZPPtrSKT),y - + >SYSCALL GetMemPtr >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base @@ -1229,15 +1183,15 @@ SKT.GetDataFromSktOut lda ZPTmpPtr1+1 adc SKT.TmpCache+S.SOCKET.TCP.OUTTAILNEXT+1 sta ZPTmpPtr2+1 - + lda ZPDataOutLen eor #$FF tax - + lda ZPDataOutLen+1 eor #$FF pha - + ldy #0 .1 inx @@ -1245,9 +1199,9 @@ SKT.GetDataFromSktOut pla inc beq .8 - + pha - + .2 lda (ZPTmpPtr2) sta (ZPDataOutPtr),y iny @@ -1257,7 +1211,7 @@ SKT.GetDataFromSktOut .3 inc ZPTmpPtr2 bne .4 inc ZPTmpPtr2+1 - + .4 inc SKT.TmpCache+S.SOCKET.TCP.OUTTAILNEXT bne .1 inc SKT.TmpCache+S.SOCKET.TCP.OUTTAILNEXT+1 @@ -1265,7 +1219,7 @@ SKT.GetDataFromSktOut cmp /K.TCP.WSIZE bne .1 stz SKT.TmpCache+S.SOCKET.TCP.OUTTAILNEXT+1 - + lda ZPTmpPtr1 Dst Ptr=Buffer Base sta ZPTmpPtr2 lda ZPTmpPtr1+1 @@ -1279,7 +1233,7 @@ SKT.GetDataFromSktOut lda SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND+1 sbc ZPDataOutLen+1 sta SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND+1 - + clc rts *-------------------------------------- @@ -1302,22 +1256,21 @@ SKT.AckDataToSktOut dey dex bpl .1 - + lda TmpDWord+3 ldx TmpDWord+2 bne .2 tay beq .8 - + .2 clc adc SKT.TmpCache+S.SOCKET.TCP.OUTTAIL sta SKT.TmpCache+S.SOCKET.TCP.OUTTAIL - + txa adc SKT.TmpCache+S.SOCKET.TCP.OUTTAIL+1 and /K.TCP.WSIZE-1 sta SKT.TmpCache+S.SOCKET.TCP.OUTTAIL+1 - lda SKT.TmpCache+S.SOCKET.TCP.OUTFREE clc adc TmpDWord+3 @@ -1325,7 +1278,7 @@ SKT.AckDataToSktOut lda SKT.TmpCache+S.SOCKET.TCP.OUTFREE+1 adc TmpDWord+2 sta SKT.TmpCache+S.SOCKET.TCP.OUTFREE+1 - + lda SKT.TmpCache+S.SOCKET.TCP.OUTUSED sec sbc TmpDWord+3 @@ -1333,57 +1286,83 @@ SKT.AckDataToSktOut lda SKT.TmpCache+S.SOCKET.TCP.OUTUSED+1 sbc TmpDWord+2 sta SKT.TmpCache+S.SOCKET.TCP.OUTUSED+1 - + .8 rts *-------------------------------------- -SKT.GetTCB ldy #S.SOCKET.TCP-S.SOCKET - -.1 dey - lda (ZPPtrSKT),y - sta SKT.TmpCache,y - cpy #S.SOCKET +SKT.NewTCB ldx #S.SOCKET + +.1 stz SKT.TmpCache,x + inx + cpx #S.SOCKET.TCP bne .1 + >LDYAI K.TCP.WSIZE + >STYA SKT.TmpCache+S.SOCKET.TCP.INFREE + >SYSCALL getmem + bcs SKT.StoreTCB.RTS + txa + ldy #S.SOCKET.SQ.hInMem + sta (ZPPtrSKT),y + + >LDYAI K.TCP.WSIZE + >STYA SKT.TmpCache+S.SOCKET.TCP.OUTFREE + >SYSCALL getmem + bcs SKT.StoreTCB.RTS + txa + ldy #S.SOCKET.SQ.hOutMem + sta (ZPPtrSKT),y + + ldx #3 + +.2 lda A2osX.TIMER16,x + sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x + dex + bpl .2 +*-------------------------------------- +SKT.StoreTCB ldy #S.SOCKET +.1 lda SKT.TmpCache,y + sta (ZPPtrSKT),y + iny + cpy #S.SOCKET.TCP + bne .1 + clc Make CC for successfull exit +SKT.StoreTCB.RTS rts *-------------------------------------- -SKT.StoreTCB ldy #S.SOCKET.TCP-S.SOCKET - -.1 dey - lda SKT.TmpCache,y - sta (ZPPtrSKT),y - cpy #S.SOCKET +SKT.GetTCB ldy #S.SOCKET +.1 lda (ZPPtrSKT),y + sta SKT.TmpCache,y + iny + cpy #S.SOCKET.TCP bne .1 - rts *-------------------------------------- SKT.Destroy ldy #S.SOCKET.SQ.hOutMem lda (ZPPtrSKT),y beq .1 >SYSCALL FreeMem - + .1 ldy #S.SOCKET.SQ.hInMem lda (ZPPtrSKT),y beq .2 >SYSCALL FreeMem - -.2 lda #0 - sta (ZPPtrSKT) - clc + +.2 clc rts *-------------------------------------- SKT.SetFrameOutDstIP ldy #S.SOCKET.REM.ADDR ldx #4 - + .1 lda (ZPPtrSKT),y pha iny dex bne .1 - + ldy #S.IP.DST+3 ldx #4 - + .2 pla sta (ZPFrameOutPtr),y dey diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 903f6bbe..136bb8c6 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -4,13 +4,12 @@ AUTO 4,1 .LIST OFF *-------------------------------------- TCP.IN jsr FRM.GetTargetSKT.TCPUDP - >DEBUG - + jsr SKT.FindMatchingLocRem bcs TCP.IN.JMP.CLOSED no socket, go discard >STYA ZPPtrSKT - + ldy #S.SOCKET.PROTO lda (ZPPtrSKT),y cmp #S.IP.PROTOCOL.TCP @@ -35,20 +34,15 @@ TCP.IN.JMP.CLOSED rts *-------------------------------------- TCP.IN.JMP.LISTEN - ldy #S.TCP.OPTIONS SYN Received, send SYN.ACK packet - lda (ZPFrameInPtr),y - cmp #S.TCP.OPTIONS.SYN - bne TCP.IN.JMP.CLOSED - ldy #S.SOCKET.T Create a new client socket lda (ZPPtrSKT),y tax Same type a listening socket - + iny #S.SOCKET.PROTO + lda (ZPPtrSKT),y + jsr SKT.Socket.I get new socket in ZPTmpPtr1 bcs TCP.IN.JMP.CLOSED - txa - jsr SKT.AddToQueueA Queued successfully ? bcs TCP.IN.JMP.CLOSED no, discard frame and new socket @@ -57,27 +51,26 @@ TCP.IN.JMP.LISTEN lda ZPTmpPtr1 sta ZPPtrSKT - ldaZPTmpPtr1+1 + lda ZPTmpPtr1+1 sta ZPPtrSKT+1 - jsr TCP.IN.ACKTheSYN + jsr SKT.SetLocAddr + jsr SKT.SetRemAddr + + jsr SKT.NewTCB + bcs .99 - jsr SKT.StoreTCB + jsr TCP.IN.ACKTheSYN lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK jsr TCP.OUT.SendOptA SYN received, Send SYN.ACK bcs .9 - ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.SYNRCVD - sta (ZPPtrSKT),y + sta SKT.TmpCache+S.SOCKET.TCP.S + jmp SKT.StoreTCB - clc - rts - -.9 lda #0 error - sta (ZPPtrSKT) clear this socket - lda #ERR.SKT.OOS +.9 lda #ERR.SKT.OOS .99 rts *-------------------------------------- TCP.IN.JMP.SYNSENT @@ -109,10 +102,8 @@ TCP.IN.JMP.SYNSENT jsr TCP.OUT.SendOptA SYN.ACK recieved, Send, ACK bcs .9 - ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.ESTBLSH - sta (ZPPtrSKT),y - + sta SKT.TmpCache+S.SOCKET.TCP.S jmp SKT.StoreTCB .9 lda #S.TCP.OPTIONS.RST @@ -143,9 +134,8 @@ TCP.IN.JMP.SYNRCVD dex bpl .1 - ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.ESTBLSH - sta (ZPPtrSKT),y + sta SKT.TmpCache+S.SOCKET.TCP.S jmp SKT.StoreTCB .8 clc @@ -185,12 +175,13 @@ TCP.IN.JMP.ESTBLSH ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.CLWAIT sta (ZPPtrSKT),y - + jmp SKT.StoreTCB + .8 clc .9 rts *-------------------------------------- TCP.IN.JMP.CLWAIT - clc Wait for SKT.CloseA from Daemon + clc Wait for SKT.shutdown rts *-------------------------------------- TCP.IN.JMP.LASTACK diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 271182a9..a5dade79 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -133,16 +133,16 @@ J.TCP.IN .DA TCP.IN.JMP.CLOSED .DA TCP.IN.JMP.TIMEWT J.SKT.Socket .DA SKT.Socket.RAW .DA SKT.Socket.DGRAM - .DA SKT.Socket.STREAM .DA SKT.Socket.SEQPACKET + .DA SKT.Socket.STREAM J.SKT.connect .DA SKT.connect.RAW .DA SKT.connect.DGRAM - .DA SKT.connect.STREAM .DA SKT.connect.SEQPACKET + .DA SKT.connect.STREAM J.SKT.send .DA SKT.send.RAW .DA SKT.send.DGRAM - .DA SKT.send.STREAM .DA SKT.send.SEQPACKET + .DA SKT.send.STREAM .DA 0 *-------------------------------------- LIB.LOAD ldx RefCount @@ -211,7 +211,6 @@ POLL >PUSHW L.IOCTL jmp IP.IN .9 lda hFrameIn - beq LIB.UNLOAD.8 >SYSCALL FreeMem .99 rts @@ -222,11 +221,10 @@ POLL >PUSHW L.IOCTL PULSE and #S.EVT.F.T1SEC beq .1 -* jsr ARP.EXPIRE -* jsr DNS.EXPIRE + jsr ARP.EXPIRE + jsr DNS.EXPIRE -.1 -* jsr DNS.POLL +.1 jsr DNS.POLL jmp FRM.RETRY *-------------------------------------- GetDynPort inc DYNPORT.LAST @@ -319,9 +317,9 @@ FD.DSOCK.SIZE .EQ *-FD.DSOCK *-------------------------------------- FD.SSOCK .DA #S.FD.T.SSOCK .BS 1 S.FD.HANDLER - .BS 1 S.FD.DSOCK.HSKT - .DA #0 S.FD.DSOCK.OPEN - .DA #0 S.FD.DSOCK.CLOSE + .BS 1 S.FD.SSOCK.HSKT + .DA #0 S.FD.SSOCK.OPEN + .DA #0 S.FD.SSOCK.CLOSE .DA #LIBTCPIP.Read .DA #LIBTCPIP.Write .DA #0 S.FD.DSOCK.STATUS diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 957feac7..2e4670fd 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -55,6 +55,7 @@ CS.RUN ldy #S.PS.ARGC >PUSHBI O.RDWR lda #1 >SYSCALL ArgV get /dev/xxx + >SYSCALL fopen bcs .9 diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index d5c6bc01..f33fd63f 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -40,14 +40,14 @@ CS.START cld .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SA.LOCAL .DA SA.LOCAL -L.NOD.Template .DA NOD.Template -L.NOD.Name .DA NOD.Name L.MSG.TCPWAIT .DA MSG.TCPWAIT L.MSG.INITOK .DA MSG.INITOK L.MSG.TCPIPERR .DA MSG.TCPIPERR L.MSG.SKTERR .DA MSG.SKTERR L.MSG.ABORT .DA MSG.ABORT L.MSG.INCOMING .DA MSG.INCOMING +L.NOD.Template .DA NOD.Template +L.CMD.Template .DA CMD.Template .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP @@ -163,6 +163,8 @@ CS.RUN.CLIENT sta (pData),y >SYSCALL GetMemPtr >STYA ZPSktPtr + >PUSHB.G hClientSocket + ldx #3 ldy #S.SOCKET.REM.ADDR+3 @@ -171,24 +173,34 @@ CS.RUN.CLIENT sta (pData),y dex bpl .3 - >PUSHB.G hClientSocket - >PUSHBI 5 >LDYA L.MSG.INCOMING >SYSCALL printf - bcs .9 >PUSHB.G hClientSocket >PUSHBI 1 - >PUSHWI L.NOD.Template - >LDYAI L.NOD.Name + >PUSHW L.NOD.Template + >LEA.G NodBuf >SYSCALL sprintf >PUSHB.G hClientSocket >PUSHW 0 - >LDYAI L.NOD.Name + >LEA.G NodBuf >SYSCALL mknod + bcs .9 + >PUSHEA.G NodBuf + >PUSHBI 2 + >PUSHW L.CMD.Template + >LEA.G CmdBuf + >SYSCALL sprintf + + >LEA.G CmdBuf + >SYSCALL puts + + >PUSHBI S.PS.F.DUPENV + >LEA.G CmdBuf + >SYSCALL execl .8 clc .9 rts @@ -221,8 +233,7 @@ CS.QUIT ldx #CONN.MAX dex bne .1 - ldy #hSrvSocket - lda (pData),y + >LDA.G hSrvSocket beq .3 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown @@ -253,22 +264,14 @@ MSG.TCPIPERR .AZ "TELNETD:TCP/IP Not initialized properly" MSG.SKTERR .AZ "TELNETD:Listen Error." MSG.ABORT .AZ "TELNETD:User Aborted." MSG.INCOMING .AZ "TELNETD:Incoming Connection [SKT=%h] From : %d.%d.%d.%d\r\n" -CMD.LINE .AS "${A2OSX}SBIN/GETTY " - - .AZ " ${A2OSX}SBIN/LOGIN" +*-------------------------------------- +NOD.Template .AZ "/DEV/TTY%h" +CMD.Template .AZ "${A2OSX}SBIN/GETTY %s ${A2OSX}SBIN/LOGIN" *-------------------------------------- SA.LOCAL .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .DA TCP.PORT.TELNET -*-------------------------------------- -SA.REMOTE .DA #AF.INET S.SOCKADDR.AF - .BS 1 - .BS 4 S.SOCKADDR.ADDR - .BS 2 S.SOCKADDR.PORT -*-------------------------------------- -NOD.Template .AZ "/DEV/TTY%h" -NOD.Name .AZ " " *-------------------------------------- .DUMMY .OR 0 @@ -278,7 +281,8 @@ SktIndex .BS 1 hSrvSocket .BS 1 hClientSocket .BS 1 TimeOut .BS 1 - +NodBuf .BS 11 +CmdBuf .BS 65 DS.END .ED *-------------------------------------- diff --git a/SYS/KERNEL.S.IO.txt b/SYS/KERNEL.S.IO.txt index 5d7c7279..0b4891bf 100644 --- a/SYS/KERNEL.S.IO.txt +++ b/SYS/KERNEL.S.IO.txt @@ -45,17 +45,45 @@ IO.Open.I jsr STDIO.SetMLIPathYA >LDYAI K.MLI.PATH+6 skip $/DEV/ jsr K.GetDevByName - bcs IO.OPEN.RTS + bcc .7 - >STYA pFD - phx DEVID + ldx #0 + +.10 lda Nod.Table.hPath,x + beq .6 + jsr K.GetMemPtr + >STYA ZPPtr1 + + ldy #0 + +.2 lda (ZPPtr1),y + iny + cmp K.MLI.PATH,y + bne .6 + cmp #0 end of string ? + bne .2 + + txa return hFILE + clc + rts + +.6 inx + cpx #K.NOD.MAX + bne .10 + + lda #MLI.E.NODEV +* sec + rts no OF found + +.7 >STYA pFD + phx DEVID/hFILE lda (pFD) #S.FD.T tax pla - jmp (.2,x) + jmp (.8,x) -.2 .DA STDIO.IOERR REG +.8 .DA STDIO.IOERR REG .DA STDIO.IOERR DIR .DA IO.OPEN.CDEV .DA STDIO.IOERR BDEV diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index de6fce9c..e5cb8111 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -239,9 +239,8 @@ Mem.NextSlot lda ZPMemMgrSPtr K.FreeMem.ERR >PUSHA >PUSHBI 1 - >PUSHWI K.FreeMem.ERR1 - lda #DEVID.SYS - >SYSCALL fprintf + >LDYAI K.FreeMem.ERR1 + >SYSCALL printf sec rts @@ -314,14 +313,13 @@ K.FreeMem tay >PUSHYA >PUSHBI 2 - >PUSHWI K.FreeMem.ERR2 - lda #DEVID.SYS - >SYSCALL fprintf + >LDYAI K.FreeMem.ERR2 + >SYSCALL printf sec rts *-------------------------------------- -K.FreeMem.ERR1 .AZ "FreeMem:Bad hMem:%h." -K.FreeMem.ERR2 .AZ "FreeMem:hMem already freed At $%H." +K.FreeMem.ERR1 .AZ "FreeMem:Bad hMem:%h.\r\n" +K.FreeMem.ERR2 .AZ "FreeMem:hMem already freed At $%H.\r\n" */-------------------------------------- * # GetMemPtr * A = hMem