From 30cdf5a6c8bbe22bb3e5de016ca19b241cd1d703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 7 Mar 2017 17:40:32 +0100 Subject: [PATCH] Kernel version 0.9 : LIBTCPIP development resuming.... --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.DEV.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/LIBTCPIP.I.txt | 5 +- LIB/LIBTCPIP.S.SKT.txt | 64 ++++++++++-- LIB/LIBTCPIP.S.TCP.txt | 11 ++ LIB/LIBTCPIP.S.txt | 6 +- SBIN/NFSD.S.txt | 2 +- SBIN/TELNETD.S.txt | 232 +++++++++++++++++++++++++++++++++++++---- SYS/KERNEL.S.DEV.txt | 15 ++- _Docs/KERNEL.md | 4 +- _Docs/LIBTCPIP.md | 11 +- 12 files changed, 301 insertions(+), 49 deletions(-) diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index 790a67d848609df6b84178d9ac7bf85db4bf347e..a2a2017e7f98ff75bb923be6d62103585737c7f9 100644 GIT binary patch delta 5628 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 delta 5818 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 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 20ddf70eb461457f2c1807286eeffe5da0cb2939..db8a71b5a5bff6f3131813b8816bb20be8e62bd3 100644 GIT binary patch delta 15573 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 delta 15263 zcmZ`gcVHA%`fp};HnTGmQg&x|vn4$w*(6I65C~0DVIhrdFoLLrut*6>Oo9emSQYGr z3-XA)oYAwKA_yufpq^(}JR5qVSWd6#iKhrE`ukqlk_|uq5cbX2-uJ%#9ve24Z`e?N zXKISi-{_my(Cn-8H@3BwBb#IBK&tLb6I!dA!=GCH4Yh5pNOlUt9i1IWb_v71{e4Jw z3*LR>OHiI?$ZE+I(s6s1W)WQ(LyZ>a%1mK+S@7Htq0+Rl)mIy6t*Q^qMN*b9j1sej z;aT-Hiz@x0Ql#ey!>jvxDP&{t{JP%uwLzri0(wVZ$X9VWlJWq>K3*8^T)sY(6Yx=z z&8_~X#sDhGA9~ADEEM3)$BlMV2-&>CFwQ!tT2hL_1dvor@JsNl9|W7`BV^h`Ii<)o zfg(vEE1l_`US3{KSaeJ0`Z+&BHIr%RnM<&_03)2YpwLxBmE|- z_BMH|Fx=lhfFw-7x19uhZf#`^(ud&;*Y<=87B@Hd_Xg&-78b8Z+Rf~+d=(W)x&`p% zTZQ3OT^%UxwxNqJbhvMa&t1WguMDYoMD!=!34rdqhPGemntQh}+}Gbeny7RSA@oO( zYM>p-_cGJbM}*<__E!H z@K;PM(EMk?JAr7;@d!~aY{%EUuD?1|5NK_wt!yYn?ngn*ZN01dgQ50N^~!cIv+hu! zzc<*v7A0<{2jcG{=b=9afXxd7UD;@d;i3h5i%ZTy-cWC_e_d}Epa#G_>T5$Qx_jZr zIjhbKc7db@Y%j{>u*~ul z<~7Ar@lQVpMM4GLv|E}+pr;GNJuBOhG=uz@Ne%(jGK)fF%csJ}&h<#09XSrElE785 zlOJD=ulP~O%c+4iy;ks*;f@|~nEBLU8Ug_%*D>ljbMTu#3fW0>3B7jY@iSZ7nyJ}@ z`PiPR<;|!E8ny<(SB_@|S{GG@TG#e8tys|)>_>XjN!(R!W+Z$SD7^&_WNMy-08l7x z6|iTU*`b9xy4UusgG1;Fp1MuGU=f7+43IkNR33=6aJjFIvG0`Y!to~1-LWRvKk}ZzH+60m2|#QCrS4!JKo^Otpm94X0Uoi;kMjuS z+J!$d8l8hrKoDeFT1RKRa?_6V$_feq??w91or+qVsqVh{glQ z3z2wGzY0Rys;*E^)w&fZ@h>sD(qD|xL_|G*<%?~gvu21dX(;ifsD6<7Wv-sgSFpC& zoH6(+(**=tt^p9e5J|6r?E32`Q_dSFSI(OR;Vl}EqlzPHP!DheEkpLVquFGWdkNIZN)7DlOXJ|yl(qXRt}6;6gHSp^Pc z8`KP!qon5<>I9m=(ZmaegBV_RDM~v?IFERp)n`v_NcaiNXZ~%-{>Pw7Nl&$sU zScNip=@n3%{Z+j8h|#8j)~Vd3$o4uue8i{^g0_(kx+Q`}_z)wNLD$3$Q$f9b%Q|8< zX9X>j?XnZ~cM)jmZ-mP`W9fihTi=bN0Bg4Q7!ADcm@z5keIAoOU@&^z^mpLu`ItmVx9|zRZkFN{KBa*yRX)tJf&3ZI9-q^7 z(f$Q)K5n!LUy`cFkt+X#eU`ss3EKHJSx+3x;+zMUrFCkA{(D9`a4W?4ZCBz^jowAJI}Y zwI0x7>j{+7fcPPCP_+?3V(AF^rXoudB4rI6Ap1sQ5BLO979ihLysB#erL_Rvo&l0I zflX_rtE#@%7w|8xMQQ-ZkRoUzl3D@Bu@Il#D%lfHL#!5VLr@Ek6iWqVB}hLV#Z=GL z^-Y1=8YC}bBFl?8#u)?yfS2GSt&&wZ6DNIZ)^YPrB|*$N3#Y6$c~mI%P}Wkip$l-< z`v%7uO~|+XjJ>1i04VTFBxMEt8icT1b;cuo$EU$;L?yjiePIv3w4K;$l6L zSCT)WCR+unhT2S8O}4WJ?_DU_PwgatYXJZX154LvRf4+YZuTjqXY?n?!ho37i}flc zGqs-`a8BvQU~g}CFUnho=Ts@VdFSzUlEjFVO-%u$oR4@hCk+6J%=P%jDkUT3LIN5w zwm|KIk<+B3`j{d!eS$bVibb`g0B+vsF&lr0Ax^_C_?s_ zB(e@9#=YfJMAqI+7U_{nQvlF0Rg7fqu-H{lN6Qr=OV-mk@N@vS&j8?)BaG<7^SAC&9IiSs ztei*@?PJyb9I6JZJXfS%WcG{H;8EHr@a?W!*hcD)s@jaoc%uj zX0bVI5CR|cM63i)IS3h+wnV%l8TVl{zlPAbkND>fQk$6n&eLt$#{ywZ>0d+aBa*NW zkw|+%XjyA;pueGec@U|evM`+k1lyNGb)tS93E;^PXF>auiTTk|NBK7ta;&HMPq>EpCPsNNHBA1uxN4Vq z{Ph3E=uZFcWF^ayn39E-IVs<>m60Xp#c2>hW`;T;hb8_ms%K>TLBQu0YnDOtk6gpa zN5dKpTuTyT(oe#$Z*Cw|QMwW0Dl#7n%X>U5FWGPOtnEJoQ@TVe-bl&yORW6A#>+nl zy+-PZF&p?TW`)ZBdyMRE1kSXmnAp%Vs2}@ct823$vIaX@1UF)5axIx=q#D43p|6YD ziNgrNVUU!zZKLhOA;E{Zb#Mk`G4b_iDJ&&GJn+a7RzCmLVQTuilVFjj7(V(=j20FqrVGBwx7x0XoP==@z0ftRAXs512r#?Cc5|vJ7)l=pa z+&EpyD4xo3U{GSKi0?m0NepfL7UY>uq9VTIX0yFen-PNo9sTH7*;3htq*)Ly9H-(# z<%(T`-o7u05C0%o#e!3$AS^vtCVv`6y8 z57)dgn`^1|H8+jSP(-Pv73uSN^$3kWnIg#zyn1Y;>uGlA`nhsIlfFPpb#oJ-Ih%Pk zxqw%bExeixuxhfEuwF>3N#Qikp^bAmopV^kIV>K<0m@Fs;SA1U3FmMo=WrHXukkF6 zhS|8uz~#uYjOjaODxfS6$5}bZitfS{c+xwD0^uAgN3*<&$!A-AQnjxcqxMdL4=>3u zKpl?OTsK2G@yl(86tz;ySaU#-h!<*+SR>SRR73_!VZD!BlBd{z#3N;5Wo%k8s!msT@PfM(S$47-5K>r8TX*mB zVlbP>(eUyhl$g87p94tS4V-&AVRBfCq$ddLCnK!gPen^Sd`+E_SmH z)8{B@3NV+hf=^Sf#y3{O(C!*?T9$12T2ARYPU(71X%dod0C3NZ^qftb3Bh(cMN-KG znVyRN2YTf45CEocL8M@H8cJ?LLkBEgQQt~GS}=S}-UbysNZ{TB$}iiB58R;W^_Hi> z0w6cUs9Aj`a-j0FT(G@NFl}FWi%_BM2b$`0(LFv-4%_Xpy#VCP=}akxsQwqa)g1Xn zPVujt;!9zQQ^1^dnAk&w`7>sC`saA*9L1XY1^i?)0c!Fn z_e;EKj*^r571c%LjF9hZyl0M5GX0-GO8yt=I@crp-wbG!KUw}Wnj$HzzX7D&Z*k6C zCCBt%_3(4yUDmG%r}>qPQ%=AUDJ97E8-nRCYr4q*i;X*Mza!dT#f(5e;u3_{`jz4Y0m8jo z6!7*c#i!!os?4jlIFDu5YXKw<4Q9v^iCG+G0P^ zdoSn+>|}9dp0XOxzFW1st;x~Ss|rdlnD!zmg%owEBDpPcin@iCTM2nqTD(O^$C(yA zj9a$R-xPu-7)dsQY8PowfNv<)bkXj>?T;%qXBvF5I-!D$o3y)Kc=O|mOK?**ZrQ`y z)6{gR?qK8rt{Wc7XVA_zNy-FDau#X%z}m7Yn$4OM2M*_@=i<;4iq$-xgXR-Zt5(1u z;ciSXWB^_cP(%UFD2@V@h{KJnW*ueDjwaYS@ym*h3)ThK1w$*=b#`WD!I%X^b1sN4 zTHz9l^{p+GUsV9wR&ra^%C@R6%kTrc z6{pg{`|#x=PWLNLb5Nvn6weBLWVhlrpTmV-iL;(mtimdKD0XQzIg~X_k#Z;7puU#C zSkmlWutBKAC$LMJHZo}{f%EC6+bB2}7{DARu@~kC(AoOR;Or9n$d3Vtd?Zx#198tf z!rzuu*HQ~3g!8x*=QAk=xD@M&6c=zQF62^N#9%I_FrsIW(OF2RRU6pMLJv_hN=dqu z%m_&AV~W0vo80Au?nZ7Vo9M1mlCB_!5{12z!WKwZ5!kD_?yupxzcxWXTM@HAlprN?^B8{ZH1jL!~6Ft9y3uXs5ukk-=9)4Oxs`s#lv{P ze#L`#7i)>4<7V8vN3n~yhn{5<=15-tLA(Ee9W}-gH$xTGIrzn}o$*{?i^=Z*J z5jc}UEyqUcGaP9W+!Te8_(#~5v=^9r_ldqq6fb~Z*sG+EL+XBx1xkGmKeJaU6rLx? zmxVK*g)yuC0#4bdShc@IpNN2XEf5 zEpNd;xgckL*K!0~{5PS{EpD}xvKj&`#1#?#Wmti+2 zjtPxW4Y`#@IsYKep563S)YqYlBF+wPMwqvM%?bQ-jJK11%lfaV5HJm3?*1RV;CaPj z`X=Jxo-C?e+qdC!i}(+0tmwZ)jkx`&nvSnKrY4A)-!X4L0vas&p6JDc>wi|0g#R&T z|A9OE(J(b`1xWshZNBgr@!t%wY2nBVa4}Q1>yV-vtOfUteNeDF{jky~$Z1f|_pBV) zgx7zj97>R1qZJwM`&=m-%y^rO$9p;lHk}jf4=rnlflZyit|_!^-3quhMx=sT%E%z5fb(rS+FM9T0u~N_UUHyH!=i6D)iU{sy|V{vHO7 zs2?RFLrnM*3@m(!1_)mU14N=xmu)~i(HILa8E68QOaQMY5O@~3%!Y8}QVev)lLvi* ztO7J-Q&}^x(3J?^NT~v$Ya9@8CgIm^Q_}{M4Rn*EB3BAQS&!6IMh>b|n}t$|I4F-? zx?ybOvT-DcT=pMr}98~R=i=!i>OJF&DP++$y8|W-V%n0Fu zgKBy{JYOK^KC04_E&~J=o-BkX2^;BK54UL(tlO@@pBz+m@k#+7*`-)ouHsex)vU_b zuHjYw6o}l{0=#lvxQth>kIZM_g%r6Tv))Lnb?|N|!7Dq~G_G5VoSX3(*;-oaA2@sH z!iRv2Ym0ynz-S;_zKOkbk>ODkIXD>}MbY+R8!)CbzmX4B6W;f!>T;$NtBmxZ)pKjB z=LZ%xAZLb%w;wV)6ey|*31=4lZ6B1f!Im9RRfmUi^o|;W5t#&AbHjCfICa4e^8mpH zwKg;7FgUqzkn_Q#VC0evr8ljY0zQ9p2~-7zVNZ*?isU7Hi}1sTRr>;{#0flHrc-zu zl;g}ZBkvSl?sO5~F<-Hbe5P9Q8%I^Up~!8(`}Zs9BwQ%j zy2n6g9kKN=Qq!Y;kbz51sM+|?Q8hu9GQo4kXBlw&J|)+Z&D=JucF2csQWehCgGnGJ(_Y*!921wY`43QhDXu_UO`5}1*+r2!~K)o(?mLaAmf^3Xj zr{brMt4`x=_<)_oTBa&jGT5{#1HJ?vkJ+u&Q4Zm3TvAJgb+Z&&hqG=~?ZO;fajWWc z`NJVTl0oM&X$t4#1GmCCfAX_x%CC<*KxA!#Mu_S0~(PqUrT77K7XPcw@EKwTV7GfN_A=1gv(kY&!|S>|jSv5~qI zKJhHm4*0fZ_`6?JeXxT`2qBetEQ=oGDW<%f;6bVha*`8~eMLBHL_uLg)|Ds8HLExl zYoNLE%JwhN5n6$n__PPxhS5C(n(d_7b1; zCiDUA@%`Kz*To$GvYto1@$~cKKEOuQ0ieab@dDy@bYgfRx5tZ^jae=Z+at+=LG*o(&_*-j^ySyM6Z5rm*Qraxu}-`3MhLTvR#gQ zU?F`YBk$N`;2k5;F_{HGvhjC~{HA8BA$Wa2M$<@NNYmmp`84*tFBPsbMo(f=;8KIc zVNf}n4@!$5Ey-}TLC#b^gW^xN!d=EFJWzrK?lodDiN&5paL?wrO9`&ExIOZaiCk`s z!hlg|2fSbiUm z<@duUW~cI>IHv~y)B7O))~6Mk9-^YKk^shN0hiI$MyeIy37 zd7okyU60~BCTLF6cA#f_4DX$w>Em{A9y?*J;BgY5sj3rF)m@zKDM;E)1b8Cy(S&;@ zXh!kL7;gFcQzwhydpHfKou4K&o*`kJGB6c_j#8hEJ3V;q8FyC5x{n6+Gxx`R0Ce>^ zAWwoii1<8^x4sbWaKZ;sj?}+IM6kYil5F)?z;nHX7nFfsUWUIHy@Jmz)4YSP0vfp^ zm<+FJVOe{fZ7-(`0>c~dji=i;3Hnt!mpNVS@4MSn{usu{9$I)VO0^ERX^i9t3cA{fKl)TJ7PB4kiTRenfi}#CCFt! z1z(YBGlR}J%}DwhP`&?Ts2)DvwEim&3D|l6&Crr(Xo~m^h0k-#-@-vdyOR1}_>&gF z5iZ{`@K5$DP?#SfOunZ`j@=91P#z(VKo_LDk4Hike`OX}0RO~@&SvzVX&g~hEnmqT#-WwRj30_cjBOu|WCa_US-vyBPqw&SJHeJ*kE(IX`9G(fO8VV*Vm z-!aH8J^^!!WYg8`Us6=B40f#PgH|{lu7#>Y<3sRZB1Hbx!wjI}nF*uY(ychFLbH`y zXR&eKsHX1JF`XNdXY)q45@%FsX=0U#H|#O#xT!+ZC)aS**0ODDb>WFA-0RN)j^p6L zVJA!3LSWD>?6kfCIS zh%aeWijvNWneRJSG9$`d#YC{J9)k%|maO5Zow2BEx&3wV!E86)KGDzwetBIU{A)7m zh-4BB_}2f$c{i+ie~9?EiNNSbqjf^0m$d$5hzv!-fk8gT0+W24ch^5dY|wu(;If&T z#rZ3XC-Mni?El89@$}yf_^g?lTR?aNINuDrV5FsP?D&iHN}`cEqiQgQolrI!*>h~k zNZZ&<6Mk)`mLVkI|IE}JqHLt|s5~=ARHBF~N7NXiBhiS@ou%jo*El2Ie%xrWSJu?D zAT`Oz;sa#OWFr`P3X#xuda995B4vw_+JylrVpk*jP-hank=dHqO8+gSG>eFQs*%p;+mU@X;~U%26D?LU g>1|c9pXqZ)^0k_uUyX71_Fs)nBvGC@QlriIKOKcS5dZ)H diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 761e5be6..5135b988 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -44,10 +44,11 @@ LIBTCPIP.HST.GETBYADDR .EQ 30 LIBTCPIP.SKT.New .EQ 32 LIBTCPIP.SKT.CLOSEA .EQ 34 -LIBTCPIP.SKT.GETTABLE .EQ 36 +LIBTCPIP.SKT.GETTABLE .EQ 36 LIBTCPIP.SKT.GETA .EQ 38 -LIBTCPIP.SKT.ACCEPTA .EQ 40 +LIBTCPIP.SKT.AcceptA .EQ 40 +LIBTCPIP.SKT.MkNodA .EQ 42 LIBTCPIP.SKT.Write .EQ 44 LIBTCPIP.SKT.Read .EQ 46 diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 9c55d8aa..aa576823 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -284,6 +284,19 @@ SKT.AcceptA jsr SKT.GetA.I .99 lda #ERR.SKT.BAD sec .9 rts + +*/-------------------------------------- +* #SKT.MkNodA +* Create a new file from TCP socket +* ##In : +* A = hSocket +* ##Out : +* A = hFile +*\-------------------------------------- +SKT.MkNodA + + sec + rts */-------------------------------------- * #SKT.Write (DGRAM,STREAM,RAW) * Send block of data @@ -292,13 +305,12 @@ SKT.AcceptA jsr SKT.GetA.I * PUSHW = pBuf * PUSHW = len * ##Out : -* A = hFrame *\-------------------------------------- SKT.Write >PULLW ZPDataInLen >PULLW ZPDataInPtr >PULLB hSocket - jsr SKT.GetA.I +SKT.Write.I jsr SKT.GetA.I bcs .9 cmp #S.SOCKET.SOCK.DGRAM @@ -435,10 +447,19 @@ SKT.ReadA jsr SKT.GetA.I * PUSHB = hSocket * PUSHB = Char * ##Out : -* A = char *\-------------------------------------- -SKT.PutC sec - rts +SKT.PutC >PULLB TmpByte + + >PULLB hSocket + + lda #1 + sta ZPDataOutLen + stz ZPDataOutLen+1 + + >LDYA L.TmpByte + >STYA ZPDataOutPtr + + jmp SKT.Write.I */-------------------------------------- * #SKT.PutS (STREAM) * Write Line in pBuf @@ -447,9 +468,17 @@ SKT.PutC sec * PUSHW = PSTR * ##Out : *\-------------------------------------- -SKT.PutS - sec - rts +SKT.PutS >PULLW ZPDataOutPtr + lda (ZPDataOutPtr) + + sta ZPDataOutLen + stz ZPDataOutLen+1 + + inc ZPDataOutPtr + bne .1 + inc ZPDataOutPtr+1 + +.1 jmp SKT.Write.I */-------------------------------------- * #SKT.GetCA (STREAM) * Read a Char From Stream in A @@ -458,8 +487,21 @@ SKT.PutS * ##Out : * A = char *\-------------------------------------- -SKT.GetCA sec - rts +SKT.GetCA sta hSocket + stz bTextMode + + lda #1 + sta ZPDataOutLen + stz ZPDataOutLen+1 + + >LDYA L.TmpByte + >STYA ZPDataOutPtr + + jsr SKT.Read.I + bcs .9 + lda TmpByte + +.9 rts */-------------------------------------- * #SKT.GetS (STREAM) * Read a CR terminated Line in pBuf @@ -488,7 +530,7 @@ SKT.Read clc >PULLW ZPDataOutPtr >PULLB hSocket - jsr SKT.GetA.I +SKT.Read.I jsr SKT.GetA.I bcs .99 cmp #S.SOCKET.SOCK.STREAM bne .90 bad skt diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 79f3f4e8..de97cd8c 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -65,6 +65,12 @@ TCP.IN jsr IP.FillSKT.TemplateSrcDst bne .6 stx hSocket + + ldy #S.TCP.OPTIONS + lda (ZPFrameInPtr),y + and #S.TCP.OPTIONS.RST RST ? go Kill this socket. + bne TCP.IN.RST + ldy #S.SOCKET.TCP.STATUS lda (ZPPtrSKT),y asl @@ -85,6 +91,11 @@ TCP.IN jsr IP.FillSKT.TemplateSrcDst .9 clc Discard frame rts *-------------------------------------- +TCP.IN.RST txa + jsr SKT.CloseA + clc + rts +*-------------------------------------- TCP.IN.JMP.CLOSED clc rts diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 36f130b8..6ac7bd19 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -76,8 +76,8 @@ CS.START cld .DA SKT.GETTABLE .DA SKT.GETA - .DA SKT.ACCEPTA - .DA $FFFF + .DA SKT.AcceptA + .DA SKT.MkNodA .DA SKT.Write .DA SKT.Read @@ -95,6 +95,7 @@ L.DNS.MSG .DA DNS.MSG L.ARP.CACHE .DA ARP.CACHE L.DNS.CACHE .DA DNS.CACHE L.SKT.Template .DA SKT.Template +L.TmpByte .DA TmpByte L.TCP.IN.JMP .DA TCP.IN.JMP.CLOSED .DA TCP.IN.JMP.LISTEN .DA TCP.IN.JMP.SYNSENT @@ -294,6 +295,7 @@ DNS.TmpCache .BS S.DNSCACHE ARP.TmpCache .BS S.ARP SKT.Template .BS S.SOCKET.TEMPLATE SKT.TCBCache .BS S.SOCKET +TmpByte .BS 1 TmpDWord .BS 4 TmpOffset .BS 2 hFrameIn .BS 1 diff --git a/SBIN/NFSD.S.txt b/SBIN/NFSD.S.txt index 3c3109f5..51fac642 100644 --- a/SBIN/NFSD.S.txt +++ b/SBIN/NFSD.S.txt @@ -105,7 +105,7 @@ CS.RUN.INIT ldx #3 ldy #hSocket lda (pData),y - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ACCEPTA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.AcceptA bcs .11 >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GETA >STYA ZPSktPtr diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index 58879ceb..806aafb8 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -12,6 +12,12 @@ AUTO 6 .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/LIBTCPIP.I *-------------------------------------- +TIMEOUT.MAX .EQ 30 30 sec. +CONN.MAX .EQ 16 +*-------------------------------------- +ZPIPCfgPtr .EQ ZPBIN +ZPSktPtr .EQ ZPBIN+2 +*-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld @@ -20,7 +26,7 @@ CS.START cld .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START Code Length To Relocate - .DA 0 + .DA DS.END-DS.START Data Segment to Allocate .DA 0 .DA 0 *-------------------------------------- @@ -31,52 +37,236 @@ CS.START cld .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP +L.Socket .DA Socket +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 .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLibYA - bcs .99 - sta hLIBTCPIP - >PUSHWI S.IP.PROTOCOL.TCP - >PUSHWI TCP.PORT.TELNET - >LIBCALL hLIBTCPIP,LIBTCPIP.NewSrvSocket - bcs .99 - sta hSrvSocket - - clc -.99 rts + lda (pPs) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc + rts *-------------------------------------- -CS.RUN >PUSHB hSrvSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.SrvSocketAccept +CS.RUN jsr Init.Timeout + + >LDYA L.MSG.TCPWAIT + >SYSCALL CPrintFYA + +.1 >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? + bcs .99 + >STYA ZPIPCfgPtr + + lda (ZPIPCfgPtr) Configured ? + bmi CS.RUN.INIT + + >SYSCALL Sleep + jsr Wait.Timeout + bcc .1 + >SYSCALL GetC + bcs .1 + cmp #$03 + bne .1 + jmp CS.RUN.ABORT + +.99 >LDYA L.MSG.TCPIPERR + >SYSCALL CPrintFYA + lda #SYSMGR.ERRSYN + sec + rts + +CS.RUN.INIT ldx #3 + ldy #S.IPCFG.IP+3 +.1 lda (ZPIPCfgPtr),y + sta Socket.Src.Addr,x + dey + dex + bpl .1 + + >PUSHW L.Socket + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New + bcs .9 + txa + ldy #hSrvSocket + sta (pData),y + + >LDYA L.MSG.INITOK + >SYSCALL CPrintFYA + +.2 >SYSCALL Sleep + jsr CS.RUN.SERVER + bcs CS.RUN.ERR + + ldy #SktIndex + lda (pData),y + tay + lda (pData),y hSockets + + beq .3 + +* jsr CS.RUN.CLIENT + +.3 ldy #SktIndex + lda (pData),y + inc + cmp #CONN.MAX + bne .4 + lda #0 + +.4 sta (pData),y + + bra .2 + +.9 >LDYA L.MSG.SKTERR + >SYSCALL CPrintFYA + lda #SYSMGR.ERRSYN + sec + rts + +CS.RUN.ABORT >LDYA L.MSG.ABORT + >SYSCALL CPrintFYA + lda #0 + +CS.RUN.ERR sec + rts +*-------------------------------------- +CS.RUN.SERVER ldy #hSrvSocket + lda (pData),y + + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.AcceptA bcs .8 - + pha - + ldy #hSockets + ldx #CONN.MAX +.1 lda (pData),y + beq .2 + iny + dex + bne .1 + + pla + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CloseA + bra .8 + +.2 pla + sta (pData),y + + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetA + >STYA ZPSktPtr + + ldx #3 + ldy #S.SOCKET.DST.ADDR+3 + +.3 >PUSHB (ZPSktPtr),y + dey + dex + bpl .3 + + >LDYA L.MSG.INCOMING + >SYSCALL CPrintFYA +.8 clc +.9 rts +*-------------------------------------- +CS.RUN.CLIENT >PUSHA hSocket + sta .1+1 + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetCA + bcs .8 + sta .2+1 + + >SYSCALL PutCA + + +.1 lda #$ff + >PUSHA + +.2 lda #$ff + >PUSHA + + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.PutC + .8 clc rts *-------------------------------------- -CS.DOEVENT clc +CS.DOEVENT sec rts *-------------------------------------- -CS.QUIT >PUSHB hSrvSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.CloseSocket +CS.QUIT ldx #CONN.MAX + ldy #hSockets + +.1 lda (pData),y + beq .2 + + phx + phy + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA + ply + plx + +.2 iny + dex + bne .1 + + ldy #hSrvSocket + lda (pData),y + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA - lda hLIBTCPIP >SYSCALL UnloadLibA clc rts *-------------------------------------- +Init.Timeout ldy #TimeOut + lda #TIMEOUT.MAX + sta (pData),y + rts +*-------------------------------------- +Wait.TimeOut sec + ldy #TimeOut + lda (pData),y + beq .9 + clc +.9 rts +*-------------------------------------- CS.END *-------------------------------------- LIBTCPIP >PSTR "libtcpip.o" +MSG.TCPWAIT >CSTR "TELNETD:Waiting for TCP/IP initializing...\r\n" +MSG.INITOK >CSTR "TELNETD:Init Ok, Listening.\r\n" +MSG.TCPIPERR >CSTR "TELNETD:TCP/IP Not initialized properly\r\n" +MSG.SKTERR >CSTR "TELNETD:Listen Error\r\n" +MSG.ABORT >CSTR "TELNETD:User Aborted\r\n" +MSG.INCOMING >CSTR "TELNETD:Incoming Connection From : %d.%d.%d.%d\r\n" hLIBTCPIP .BS 1 -hSrvSocket .BS 1 *-------------------------------------- - +Socket .DA #S.SOCKET.SOCK.STREAM + .DA #S.SOCKET.SO.ACCEPTCONN + .DA #S.SOCKET.TCP.STATUS.LISTEN + .BS 1 +Socket.Src.Addr .BS 4 +Socket.Src.Port .DA 23 +Socket.Dst.Addr .BS 4 +Socket.Dst.Port .BS 2 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +hSockets .BS CONN.MAX pData +SktIndex .BS 1 +hSrvSocket .BS 1 +TimeOut .BS 1 +DS.END + .ED +*-------------------------------------- MAN SAVE SBIN/TELNETD.S ASM diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 6d5fdb92..dadb965f 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -1,6 +1,6 @@ PR#3 PREFIX /A2OSX.SRC -NEW +LOMEM $900 INC 1 AUTO 6 .LIST OFF @@ -100,7 +100,7 @@ K.GetDevStatusA jsr K.GetDevByIDA jmp (ZPPtr1) */-------------------------------------- * #MkNodYA -* return a S.FILE for a given Device NAME +* return a hFile for a given Device Name * ##IN: * Y,A=DevName * ##OUT: @@ -164,7 +164,7 @@ K.MkNodYA jsr K.GetDevByNameYA Ptr1=NAME .4 jmp $ffff */-------------------------------------- * #MkNodA -* return a S.FILE for a given Socket +* return a hFile for a given Socket * ##IN: * A=hSocket * ##OUT: @@ -186,7 +186,7 @@ K.MKFIFO >PUSHWI 256 jsr K.GetMem bcs .99 - phx save FIFO buffer + stx .1+1 save FIFO buffer >PUSHWI S.NODE.FIFO >PUSHBI S.MEM.F.INIT0 @@ -201,15 +201,14 @@ K.MKFIFO >PUSHWI 256 sta (ZPPtr1),y iny S.NODE.FIFO.hMem - pla +.1 lda #$ff Self Modified sta (ZPPtr1),y txa clc rts -.9 plx get back FIFO buffer - pha save error code - txa +.9 pha save error code + lda .1+1 get back FIFO buffer jsr K.FreeMemA pla sec diff --git a/_Docs/KERNEL.md b/_Docs/KERNEL.md index 77aa512c..c0956539 100644 --- a/_Docs/KERNEL.md +++ b/_Docs/KERNEL.md @@ -159,7 +159,7 @@ Prints Pascal/C-Style String + Y,A = Ptr to S.DEVINFO #MkNodYA -return a S.FILE for a given Device NAME +return a hFile for a given Device Name ##IN: + Y,A=DevName @@ -169,7 +169,7 @@ return a S.FILE for a given Device NAME + A = hFILE #MkNodA -return a S.FILE for a given Socket +return a hFile for a given Socket ##IN: + A=hSocket diff --git a/_Docs/LIBTCPIP.md b/_Docs/LIBTCPIP.md index a0d8f95f..5e7283f6 100644 --- a/_Docs/LIBTCPIP.md +++ b/_Docs/LIBTCPIP.md @@ -110,6 +110,15 @@ ##Out : + A = hSocket +#SKT.MkNodA ++ Create a new file from TCP socket + +##In : ++ A = hSocket + +##Out : ++ A = hFile + #SKT.Write (DGRAM,STREAM,RAW) + Send block of data @@ -119,7 +128,6 @@ + PUSHW = len ##Out : -+ A = hFrame #SKT.ReadA (DGRAM,RAW) @@ -137,7 +145,6 @@ + PUSHB = Char ##Out : -+ A = char #SKT.PutS (STREAM) + Write Line in pBuf