From 5ddf49905593136ed7a6ba817c4ad316e9ea5f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 17 Sep 2018 17:42:38 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Docs/LIBTCPIP.md | 55 +++++++++----- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/PING.S.txt | 10 +-- BIN/RPCDUMP.S.txt | 12 +-- BIN/TELNET.S.txt | 3 +- INC/LIBTCPIP.I.txt | 7 +- LIB/LIBTCPIP.S.CFG.txt | 4 +- LIB/LIBTCPIP.S.DNS.txt | 8 +- LIB/LIBTCPIP.S.ICMP.txt | 2 +- LIB/LIBTCPIP.S.IP.txt | 17 ++++- LIB/LIBTCPIP.S.SKT.txt | 154 +++++++++++++++++++------------------- LIB/LIBTCPIP.S.TCP.txt | 40 +--------- LIB/LIBTCPIP.S.UDP.txt | 16 +--- LIB/LIBTCPIP.S.txt | 9 +-- SBIN/DHCPCLNT.S.txt | 10 +-- SBIN/HTTPD.S.txt | 7 +- SBIN/NFSD.S.txt | 7 +- SBIN/TELNETD.S.txt | 157 +++++++++++++++------------------------ 19 files changed, 227 insertions(+), 291 deletions(-) diff --git a/.Docs/LIBTCPIP.md b/.Docs/LIBTCPIP.md index 339b62ea..e5105d17 100644 --- a/.Docs/LIBTCPIP.md +++ b/.Docs/LIBTCPIP.md @@ -53,12 +53,18 @@ Y,A = PTR to DNS.CACHE # SKT.New - Create a new socket -**In:** - PUSHW = PTR to S.SOCKET template -**Out:** - Y,A = PTR to new S.SOCKET - X = hSocket +Create a new socket + +## C +`hSOCKET skt.new(void *template);` + +## ASM +**In:** +`>LDYA template` +`>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New` +**Out:** +CC: A = hSOCKET +CS: A = EC # SKT.Close Close socket @@ -87,11 +93,17 @@ A = hSocket # SKT.MkNod - Create a new file from TCP socket -**In:** - A = hSocket -**Out:** - A = hFile + +## C +`hFD skt.mknod(hSOCKET *s);` + +## ASM +**In:** +`>LDYA s` +`>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.MkNod` +**Out:** +CC: A = hFD +CS: A = EC # SKT.Read (STREAM) @@ -103,7 +115,7 @@ `>PUSHWI count` `>PUSHW buf` `lda fd` -`>SYSCALL read` +`>LIBCALL hLIBTCPIP,LIBTCPIP.skt.read` **Out:** CC: Y,A = bytes read CS: A = EC @@ -118,7 +130,7 @@ CS: A = EC `>PUSHWI count` `>PUSHW buf` `lda fd` -`>SYSCALL write` +`>LIBCALL hLIBTCPIP,LIBTCPIP.skt.write` **Out:** CC: Y,A = bytes written CS: A = EC @@ -130,7 +142,16 @@ CS: A = EC A = hFrame # SKT.Send (DGRAM,RAW) -**In:** - A = hSocket -**Out:** - A = hFrame + +## C +`int skt.send(hFD fd, const void *buf, int count);` + +## ASM +**In:** +`>PUSHWI count` +`>PUSHW buf` +`lda fd` +`>LIBCALL hLIBTCPIP,LIBTCPIP.skt.send` +**Out:** +CC: Y,A = bytes written +CS: A = EC diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 9cb360afc337cb7bd7b3f67e08bb0b68478ece33..180f147c82c317f649ad34c77ae7f453e232f21b 100644 GIT binary patch delta 10540 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 delta 10364 zcmahv3s@B8+TYCVE(;5|+?T7vUPLagfGG>QG9z~dBtS$&T~bO)z?4e60VQVUa@Z`# zJ%_Dn6LXdIELM6vg~wB=pjq4btJCqXQz!4&Ht(6m|9&$IqV@kj&%@5ld;i|=ec$hU z=bN^+^tQHimrg=NZ5${0lVpNUr`&iz@+jPl4c(X})ksox(SaN5q?_Spod4UuNcE%+ zm9XVS#q&z_GfK)3{`-;eLDv;%l}0W{=r}@~G$A2xm&tEa)Od9K?b-hCY*rRa&@<{J zr3TP+vQ9N-V@S^iWiN$pYSjuaFf;7!Klen)l;h%obc#qSnDOO~*@S%KxZV^Us>~}c z&8y56w8D>U5lJBlh2GYt`3h20I<4>9PxKOm@-rDoNf4zZ>9YLZUgxYYRz4mLP+tsP zUmdRt8T0lpKfN+IC*~Vep`VjmrmrZ^DVtqhxj~rFuSa>Xm)AEopGd1LhLn zxnuY;#9aqY5)oYVAwokCT=pSCOOV`>Lxhf?xb^rV;arD+QOX^~7a4aBUwk;90U~y) zoJd09zJy?-cO2Nlv~(o*BZT>jP>5Ll{gv~|^7O3W@-(FK=N1hR5t9S%!se8+C3(+d z(X&+;IOL%Zpn_p)fq?uvcN!ZlZs^ulvSdkm1Zx$emKGI(te8N4>M(I?}J3)S>EjVpFnwQ>&c*H>+|F$4RR z?(011sJ2uOI7myi%4Dbd-vrCKi&f;GgQ<4~?OaK(sqUBu zC?&hA+7o1_c;Egvx$L=Q#8f5g{_nephRpt~Ie@kM0cEyQ!;^j0hKv5}KwtI60JbZn zuNsi+;Mbq!EOW`mDC;z*b=si8eY`iHb{5d~Bp9k=yuoBX$Em8x)CF%Dd&_BO1x@#A z=|ftl?{v3@9~#)(WVFKV4d;b@^b-l@G1EJh)14QE`=IHa!P9#yY3Ce)=epK;&FGOj z+RSH-y;Zbxt^hr%qa6v(x452aat7%;ojY4iwi9Q$N9K{0d6CmSzWW*XRR^+0PB(RL zGj=_EZd^%sY%Gd7*Rrh>RWF ztofvt*ugEIPo~$LH4f}=b6@X$nsz=zZ}`|~K5BFj=1+{yr|5%Uzx=iHN#Wu^!UN22 z92WYkUE2RoqwT!W_CmIe%eM7p+y0(?Sa}|T;hNEA%eEcLw*70*?fIls8SuF=k?>5g zD=_98E^rwc+d3?!+4%>?Bcp56y8pm9yS%qujFXt|NdQsAblbNe^+xwM+1>xnb~cL! zH3=8`om5w9C$LFHTIv5oE9vZFRHoi)+BuK*fv8>enmn6(V;LDoq;mV0k?K~kWHG%a z(Y0^@ChTPPfP)ZzN8N8WXD|+AHZZ-H_Bnspx8Y>A`Be6Xjg0vf24ebErh609%`x4Z zanRpNbVb16=(x+IRj7)*}629w~hf6TH+Q10V4B=9oz%@0J zD&jKtLL(XHb2)pR^83yox!y){T!xidr@YxcTH|wO3qz+Sb%oHoleSd$%&}j<(-g6u zCoI)Y3-fX{PwusFzD?vq#7-Id{n;O@2Vly&!tirnwGHy~+a^*q z6SRG}rKV>-t^jmRGEBvY;^BgzdXaR80-HqDSA7;ifjR8H?xKLWr&`tE-%;H~o|^Xw zSkE?-VN+qc!f0X=;MXQ&2g`>aR3h<5@G!S_;>#w-oZ>4hDWB97C2usF8dugg;xs{RyEtLVO4yf-LJ2(QO%mwP}~X|HLO{~!pP6_DyN!lKt;em;M92U_=vv3 zL77`hpUP^Z2ZP*UJu?kw)qH}buxHj;w9ZmU|1`DDXOM7H^kWm9IP-vZUaBjI{(geX z-xsV0Gn2WH#dv1-Ph~_O7j_f@tp5?FV`l$TOvkMLS(m#L&A}kaD@fKv9U1A(Tq<^iX`D+MvnRex%LOJgn)} z3}|j?BD9}tKhYu7tD>Eew0$#3H0Nl0b2#QnGM3KOu5;h)&ecK*xv?mG*?S2`|0EHU4HZ=jr)p&0KxP)wd*V_?OJZMB4;WTZ*WSz+|G%VQsF(4#^!=zM?9!t%UwT?K%gmRj$?< zEy{=zE|^aOR@%o<{guP|!BJ(L?I|)N21bb~Qh~x1z`HHS#998nKKndnGP^(?82Kcy44B1R|$-`hSMXDidf^Hn}p zcpe;QE9MqHOU5eSRJWa=t!m)2szIomd+AwnVnT~{`#|3b>q_lm_YD(I^qm;=?IIoW zfx^BMwp{JNnWb6ot60;2o+ZcX?r^7J;op3vb<054H5|13CyoKjF}Uo}wUS39yVsEN zD8`RcB1VFcp3bKytG`hDX+pJHZJ1_~W{GCCW~1hF&34UQ0p{{EhiG?w=}W%+B~-5v zuJARon7FmE?P@4j6D#*u_J(L7ej$R?c-{#Oci=U0J`u;ozfQ)ts_?*X@V?GV`^;*s z<=6l$AZ88R+%r2MLx{pLz2j(Sf_EG9sll|K_puz~efy4?$7=`RH&M$g41LEMkmZ;; z2}6XtWG#J5&HH#GbyR$34~LCoybx)i28XI^KG1`;_Hi(4F3BL}nTfgaNN@yn`NJ@} zzNK^3TX~WUaizD#^YT$4K`-HCc344Q;Bi5q9A0?aXYCbwr(NAm8jpe>+4fr zcT@_$b9Qa|E7?SR!ZrVuoY)FG+RAl@-Pd@v16dd$C>Wb}FB%Ua`6grezcjB|rfyR!S&RCUa?qg_>= z_(94Y%S-yI{&k3PhYswQyUBrp{ekXFAc}rtk}Js6Q>AL4JE~v_ntSFu#(e}3Tg z^7sQ2Yj`b`=%rBRp*q9X+)Wk#Ne{J|Dt>w@)M|=8l7XrJ{2tVN*!Y4s>Wj=lY`0MV zyR~e$j^&YRpsz+;1lGZgun2U?FKJmfbxFte)TkQBjv7!t|0t}Z|J5`9Xb|iE7}f_> zqn0fi+6L=GqYiFNUMGGg`VE{2Yugdw!NkY)6><;0PsV}YjXxRPArO$4c}!C1b$Xiu zoc@auo*-1|kJPR}yOfvqzXj_U4qlZwlQqIj&WBj6Sr=5}_N7bWEj8;0EHz%Y_T#NA zY!MVJxVF|4_KzBOJh-;zvs!l~?jEi!aqKggoC;Q{*izfG0M9|Eg6*lr{;h=}F2Mdh z1o+g+{FuHPOVv8%PrGUcNp}>KfSN?o9ZVmZ;)-!VN0a3WgI0vJQ~|Yb+x9J0J#$qi z$KMPl`XE=^PuAx9Wzh%IToQ~hCAJPSuJpnYD?#s4PfWKbZD!M*|3W;^LmgF1>*sdN zg}@*|UjOcWeTw?^V&)yHXvdg3<4lGN6VX0tPRWK|iv^Z6Rk}l<-+$E=<Uy*7ikWk3>{>_Nl8L;!NN8jAMyqRjib2du}NL$?@FZuE3`I zEaN_L=^W!c#|+Bd$GXokJvErFV?opR<~9R4^D}H#Xk7*{1YBa=B#iQ2gHB_EX3TFqBUn^4w7sXG zXsB?>!X=A%bjB@R8s#Y{be?8Pz(Tq63{!HB@l4)TTX^X-?k8g`%bPi$qHeCl`vAo?HZ$I{jEo;m10CS)lM`!BRQSZXcGOk-<}aRlZ6~70l?C zg*}V#ng!PHyoUXI9s74aAAFBPuZRx4Dwr=gv*HSN=2gadRdnXnyPbJWaOO2e5NN*6 zIDZnH`4i*3g?)F6ao!LBHyGzl47kaFVO!%UNtEd~%6}Awt zmq+OZnTC_4Wc0u+%n$%hM0eG3?Gj@W(dK6jkF7jQIy< zeWQm-^f7xF=QT#vIEFO~rZ+;*A=qxX2q3}u$rk~3i!t%q;ruJ#5SL*do3Wk;mqNpK zo&jEm9Hs?W#XTX#a_^|AannvSwxJ=Rw(&}@gI&LF$jmTjW!N?SLqoRHxE7j5Bj;t9 zYcTRO7p|f5xo0%g#JK6Hyn56E!)xKeEvz=5!fM00G*tLjEu|*+9^wWxRBZGi=Cdm3 zub>)U=6$!-2+VbAme;O+`m08TyWnzV?(RK{Jdd3 zUYe#jpj^TKT%3X6*9K(!nX&n>xVpmx(h{{Jm|n=$sM|gw`6o#jS z9=~}CeIJ-}B(o=9S^(YJA>6t_GAuUhO?m^`Rn?av#6th*MoS^%$e}UsVCoXQOS1X zyU2qDJ&dYBUDyMx+n1^uw-!=lu#)W}&UECi%@gXzO{Vt-=Psb4Ti?oZrO?C_Q7^qL z%N6I8K`NJ;Wvo-m*3ULeaVkr2DpM?Y%4B{d3rattf$@rCh@WUFgn)5Ju&a?4u>~blVMwwhBsJl2`?A7S?YoPe(tNVK*I{oFKInhDDM^A(5x(cOhpE|w@<1?3(vAxR@YK2lonQE#Uml?pDdh=puA+q2 zB!zyQ?udUSK0&=x{TKB<^(1wP`T_Nm>Q~hWfy=)1Odj3;rmK6?)etnWt&d&vUB`cR zeWwhANE_4looyFavzdw|c51;p;1lsu-@5+j~nZKB_&EeTu3U!a-zmiTAm z`{HlM_m1B^{&3>>Bud||e6(aVdH-p9hsGecMW7_ zYHQ|0nGKnbXRgV#W;!wv+W8XWjxm2|q+8|{&;-q{Jp+4DJO}3^=Q>R&_+3=hG z{GfWIKR?LL{6KxdZg?|&dkP2R3C@6f=D_+7Ad$G+Mu zIBbVTxNH|LJOypiG22!y;zLP%IIqD){GP`BAXoaKBqDk}FNHTpcY60bFZ54vtshDf z$ABd%5TaeOZ5~arLCxJCD-Y+6eke&J?thaY$*rGA$W8ks&l16VTK7rX38*iUJ(9zc z+hLn-Q%OGYKFF%C%;)~TTNdeq;J`O&e*#x{S(@IOFad@7qnfg^mKAB8_$;fYY(`Nj z3J(xr>33jo#1}aRpv4VM^)nuOP&ii{K#UTU4$7kiL~i|qfEuMd z9hAocsuY+ z6x@ugD_iQ?$1l&VYpF|2S&gL2krgQ(#dNFMHItBZ1w6;B77&RqzSsmR2qxzr$;y0xOdX$ew114o3sA&{e$XcYIeD_F#Ltel>8tuBob)sSAiysHWUi2!Of~4!QVK3b=Y{TyvX7@gSI%Q0M+Kf4 zbt~(U^c65A>{afK5Lsv|HyjLJnVat&P?&XCW^r+Q{)+nglKMs@{UaXDpF~;>ocDKw zDfNqy+=i?xT2>ivsQ5`x!;; z=}7e^R~jmdAhvMqSJIICdc5+tit^=eiQgAQZ$mk7YCk)#DzCJ1y*LwjkJmS~BqG|u zIYVV*XYTM05KsPWnEc@0dq=2nf~)Hvg#bXlJ8>88#V8G)j($K2KOZG5hCS*oMp{;QvL#<(7i~X26J53zO=Y# z27E43RE89P^|C?nd2f^p=QJ&Au3J*v@Bos&53GLuNN?a4FM~PQ=e6)}qJ^>hIp1(u zOzYphvsGDCk~e!!rM`r%M!_H4J52e9Uha=X?$85hBzM4l>+mcG9lY14hki5Iff1j| z2ay%*3PXN}As#p!9`Yli@VJk;z2UOhc}E2b6#5CW)-73lSFnbDDq1)?fP>wlx{1Qq zJjqZ>!$12CXL1?}{|7fQLKZglb8uU6E@VNmzNDf+pF5|dEENTRG0K_CAHzZWCHOJm zpW+lieVl|6zT#RVWaG5|8X1iA7|;a$w|D$$hK}XUD_T(W*T~8}qmro<-ymy4(`pp` zZxIj?9{k-f?c|Q-E1FxHQS^VjI92HJVO(0r(iYDT@icjYbmUCH;(w_B1r%7jAo`ECs#*`e&pp z5xxK-qGT!f3!sTnvhgH*0yHm5rt>4kuXi*Q!L5su#cL&m6|+x5ky1ij{qz+p7VFt1 zOICDX#C<4U#vP54(eP!^r6`$-kaIrKGVNqvQBI^EF=}b*6gWDni*iwj0t6RUw8JM# z&!-x5*y3Uo=Fgd;WuZg>_gJ)yZV2=e_@t&kUzJy0fuhHZK<<0Ktb{EqE1#XS2*)N0 zQr?l4Q=XTL0)j>W?I68VZUgyp_{S;1`3r@#M&3K_XZuk0bV^ f$w-D+8z);E=d(6WzBbNxZJgiQIK|dD{|EjD5eR>+ diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index bedba2765d0d9af4473e6700978e7c4f3206648e..66ff8c312375994e15df56dd9aa7ab56f27200c5 100644 GIT binary patch delta 31453 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 T)qy)?9k^=OfzKMMb0O+j delta 31929 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 z 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 qPUSHW L.Socket + >LDYA L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcc .2 @@ -171,8 +171,7 @@ CS.RUN.OPENSKT ldx #3 sec rts -.2 txa - >STA.G hSocket +.2 >STA.G hSocket CS.RUN.SEND.ECHO ldy #Identifier @@ -197,10 +196,9 @@ CS.RUN.SEND.ECHO jsr Init.Timeout - >PUSHB.G hSocket - >PUSHW L.ICMP.Request >PUSHWI ICMP.RequestLen - + >PUSHW L.ICMP.Request + >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Send bcs CS.RUN.ERR diff --git a/BIN/RPCDUMP.S.txt b/BIN/RPCDUMP.S.txt index 578e06cc..e2824442 100644 --- a/BIN/RPCDUMP.S.txt +++ b/BIN/RPCDUMP.S.txt @@ -106,9 +106,7 @@ CS.RUN jsr Init.Timeout >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcs .91 - txa - ldy #hSocket - sta (pData),y + >STA.G hSocket ldx #3 @@ -117,10 +115,9 @@ CS.RUN jsr Init.Timeout dex bpl .21 -.3 ldy #hSocket - >PUSHB (pData),y +.3 >PUSHWI RPC.Request.End-RPC.Request >PUSHW L.RPC.Request - >PUSHWI RPC.Request.End-RPC.Request + >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Send bcc .4 @@ -131,8 +128,7 @@ CS.RUN jsr Init.Timeout .4 jsr Init.Timeout -.5 ldy #hSocket - lda (pData),y +.5 >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Rcvd bcc .6 diff --git a/BIN/TELNET.S.txt b/BIN/TELNET.S.txt index b5a98a55..24b78a54 100644 --- a/BIN/TELNET.S.txt +++ b/BIN/TELNET.S.txt @@ -154,8 +154,7 @@ CS.RUN.OPENSKT ldx #3 sec .9 rts -.2 txa - >STA.G hSocket +.2 >STA.G hSocket >LDYA L.MSG.SKTOK >SYSCALL puts diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 20a14775..e7773769 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -218,15 +218,14 @@ S.ICMP.SEQUENCE .EQ S.IP+6 * S.ICMP .EQ S.IP+8 *-------------------------------------- -S.UDP.SRCPORT .EQ S.IP+0 -S.UDP.DSTPORT .EQ S.IP+2 +S.TCPUDP.SRCPORT .EQ S.IP+0 +S.TCPUDP.DSTPORT .EQ S.IP+2 +*-------------------------------------- S.UDP.LENGTH .EQ S.IP+4 S.UDP.CHECKSUM .EQ S.IP+6 $0000 = DISABLE * S.UDP .EQ S.IP+8 *-------------------------------------- -S.TCP.SRCPORT .EQ S.IP+0 -S.TCP.DSTPORT .EQ S.IP+2 S.TCP.SEQNUM .EQ S.IP+4 S.TCP.ACKNUM .EQ S.IP+8 S.TCP.DATAOFFSET .EQ S.IP+12 diff --git a/LIB/LIBTCPIP.S.CFG.txt b/LIB/LIBTCPIP.S.CFG.txt index 069ab29f..04c3d754 100644 --- a/LIB/LIBTCPIP.S.CFG.txt +++ b/LIB/LIBTCPIP.S.CFG.txt @@ -513,7 +513,7 @@ SET.IPCFG.I >LDYA L.DCB.NIC stz DNS.SOCKET.SP stz DNS.SOCKET.SP+1 - >PUSHW L.DNS.SOCKET + >LDYA L.DNS.SOCKET jsr SKT.New bcs .9 @@ -532,7 +532,7 @@ SET.IPCFG.I >LDYA L.DCB.NIC stz DNS.SOCKET.SP stz DNS.SOCKET.SP+1 - >PUSHW L.DNS.SOCKET + >LDYA L.DNS.SOCKET jsr SKT.New bcs .9 diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index ba262030..73d149e2 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -102,7 +102,6 @@ DNS.REQUEST lda hDNSSocket1 beq .8 jsr DNS.REQUEST.SEND - jsr SKT.Send bcc .8 .99 lda #ERR.DNS.ERROR @@ -114,9 +113,10 @@ DNS.REQUEST lda hDNSSocket1 rts *-------------------------------------- DNS.REQUEST.SEND - >PUSHA - >PUSHW L.DNS.MSG + pha >PUSHW DNS.MSG.LEN + >PUSHW L.DNS.MSG + pla jmp SKT.Send *-------------------------------------- DNS.CSTR2DNS lda (ZPPtrDNS) @@ -532,7 +532,7 @@ DNS.DecodeMsg sta hFrameIn jsr DNS.UPDATE.BY.ID .9 lda hFrameIn -* >SYSCALL FreeMem + >SYSCALL FreeMem clc rts *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.ICMP.txt b/LIB/LIBTCPIP.S.ICMP.txt index 0b9f0712..3e5b891d 100644 --- a/LIB/LIBTCPIP.S.ICMP.txt +++ b/LIB/LIBTCPIP.S.ICMP.txt @@ -73,7 +73,7 @@ ICMP.IN.EXIT lda hFrameIn >SYSCALL FreeMem .8 rts *-------------------------------------- -ICMP.IN.ECHOREP jsr IP.FillSKT.TemplateSrcDst +ICMP.IN.ECHOREP jsr IP.FillSKT.TemplateSrcDstIP lda #S.IP.PROTOCOL.ICMP sta SKT.Template+S.SOCKET.RAW.PROTO diff --git a/LIB/LIBTCPIP.S.IP.txt b/LIB/LIBTCPIP.S.IP.txt index fd493a84..5d2c5630 100644 --- a/LIB/LIBTCPIP.S.IP.txt +++ b/LIB/LIBTCPIP.S.IP.txt @@ -91,7 +91,22 @@ IP.ComputeChecksum eor #$FF rts *-------------------------------------- -IP.FillSKT.TemplateSrcDst +IP.FillSKT.TemplateSrcDstIPP + ldy #S.TCPUDP.SRCPORT + lda (ZPFrameInPtr),y + sta SKT.Template+S.SOCKET.DST.PORT+1 + iny + lda (ZPFrameInPtr),y + sta SKT.Template+S.SOCKET.DST.PORT + + iny #S.TCPUDP.DSTPORT + lda (ZPFrameInPtr),y + sta SKT.Template+S.SOCKET.SRC.PORT+1 + iny + lda (ZPFrameInPtr),y + sta SKT.Template+S.SOCKET.SRC.PORT +*-------------------------------------- +IP.FillSKT.TemplateSrcDstIP ldy #S.IP.SRC+3 ldx #3 .1 lda (ZPFrameInPtr),y diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 4593bdf1..b55e3ed0 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -4,21 +4,27 @@ AUTO 4,1 .LIST OFF */-------------------------------------- * # SKT.New -* Create a new socket -* **In:** -* PUSHW = PTR to S.SOCKET template -* **Out:** -* Y,A = PTR to new S.SOCKET -* X = hSocket +* Create a new socket +* ## C +* `hSOCKET skt.new(void *template);` +* ## ASM +* **In:** +* `>LDYA template` +* `>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New` +* **Out:** +* CC: A = hSOCKET +* CS: A = EC *\-------------------------------------- -SKT.New >PULLW ZPTmpPtr1 - ldy #S.SOCKET.SRC.PORT+1 +SKT.New >STYA ZPTmpPtr1 + ldy #S.SOCKET.SRC.PORT lda (ZPTmpPtr1),y - dey + iny ora (ZPTmpPtr1),y bne .1 jsr GetDynPort + + ldy #S.SOCKET.SRC.PORT sta (ZPTmpPtr1),y txa iny @@ -101,8 +107,7 @@ SKT.New >PULLW ZPTmpPtr1 .8 lda TmpByte ora #$80 - tax - >LDYA ZPPtrSKT + clc rts @@ -293,33 +298,20 @@ SKT.Accept jsr SKT.Get.I .9 rts */-------------------------------------- * # SKT.MkNod -* Create a new file from TCP socket -* **In:** -* A = hSocket -* **Out:** -* A = hFile +* ## C +* `hFD skt.mknod(hSOCKET *s);` +* ## ASM +* **In:** +* `>LDYA s` +* `>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.MkNod` +* **Out:** +* CC: A = hFD +* CS: A = EC *\-------------------------------------- -SKT.MkNod sta .1+1 +SKT.MkNod sta FD.SSOCK+S.FD.SSOCK.HSKT + >LDYAI S.FD.SSOCK >SYSCALL getmem0 - bcs .9 - - >STYA ZPTmpPtr1 - - ldy #S.FD.T - lda #S.FD.T.SSOCK - sta (ZPTmpPtr1),y - - ldy #S.FD.SSOCK.HSKT -.1 lda #$ff - - sta (ZPTmpPtr1),y - >LDYA ZPTmpPtr1 - rts - - - - bcs .9 >STYA ZPTmpPtr1 @@ -330,6 +322,7 @@ SKT.MkNod sta .1+1 sta (ZPTmpPtr1),y dey bpl .2 + txa * clc @@ -343,7 +336,7 @@ SKT.MkNod sta .1+1 * `>PUSHWI count` * `>PUSHW buf` * `lda fd` -* `>SYSCALL read` +* `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.read` * **Out:** * CC: Y,A = bytes read * CS: A = EC @@ -393,7 +386,7 @@ SKT.Read.I jsr SKT.Get.I * `>PUSHWI count` * `>PUSHW buf` * `lda fd` -* `>SYSCALL write` +* `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.write` * **Out:** * CC: Y,A = bytes written * CS: A = EC @@ -475,17 +468,25 @@ SKT.Rcvd jsr SKT.Get.I .9 rts */-------------------------------------- * # SKT.Send (DGRAM,RAW) -* **In:** -* A = hSocket -* **Out:** -* A = hFrame +* ## C +* `int skt.send(hFD fd, const void *buf, int count);` +* ## ASM +* **In:** +* `>PUSHWI count` +* `>PUSHW buf` +* `lda fd` +* `>LIBCALL hLIBTCPIP,LIBTCPIP.skt.send` +* **Out:** +* CC: Y,A = bytes written +* CS: A = EC *\-------------------------------------- -SKT.Send >PULLW ZPDataInLen +SKT.Send pha >PULLW ZPDataInPtr - >PULLA + >PULLW ZPDataInLen + pla jsr SKT.Get.I - bcs .9 + bcs SKT.Send.9 cmp #S.SOCKET.SOCK.DGRAM beq SKT.Send.UDP @@ -495,7 +496,7 @@ SKT.Send >PULLW ZPDataInLen lda #ERR.SKT.BAD sec -.9 rts +SKT.Send.9 rts *-------------------------------------- SKT.Send.RAW ldy #S.SOCKET.RAW.PROTO lda (ZPPtrSKT),y @@ -503,50 +504,22 @@ SKT.Send.RAW ldy #S.SOCKET.RAW.PROTO tax >LDYA ZPDataInLen jsr FRM.NewIP - bcs .9 + bcs SKT.Send.9 - jsr SKT.SetFrameOutDstIP - - jsr SKT.CopyDataInToOut - - jmp FRM.SendIP - -.9 rts + bra SKT.Send.UDP.8 *-------------------------------------- SKT.Send.UDP ldx #S.IP.PROTOCOL.UDP >LDYA ZPDataInLen jsr FRM.NewIP - bcs .9 + bcs SKT.Send.9 - jsr SKT.SetFrameOutDstIP + jsr SKT.SetFrameOutTCPUDPPorts - ldy #S.SOCKET.SRC.PORT - lda (ZPPtrSKT),y - tax - iny - lda (ZPPtrSKT),y - ldy #S.UDP.SRCPORT - sta (ZPFrameOutPtr),y - iny - txa - sta (ZPFrameOutPtr),y +SKT.Send.UDP.8 jsr SKT.SetFrameOutDstIP - ldy #S.SOCKET.DST.PORT - lda (ZPPtrSKT),y - tax - iny - lda (ZPPtrSKT),y - ldy #S.UDP.DSTPORT - sta (ZPFrameOutPtr),y - iny - txa - sta (ZPFrameOutPtr),y - jsr SKT.CopyDataInToOut jmp FRM.SendIP - -.9 rts *-------------------------------------- * PRIVATE *-------------------------------------- @@ -1185,6 +1158,31 @@ SKT.SetFrameOutDstIP bne .2 rts *-------------------------------------- +SKT.SetFrameOutTCPUDPPorts + ldy #S.SOCKET.SRC.PORT + lda (ZPPtrSKT),y + tax + iny + lda (ZPPtrSKT),y + ldy #S.TCPUDP.SRCPORT + sta (ZPFrameOutPtr),y + iny + txa + sta (ZPFrameOutPtr),y + + ldy #S.SOCKET.DST.PORT + lda (ZPPtrSKT),y + tax + iny + lda (ZPPtrSKT),y + ldy #S.TCPUDP.DSTPORT + sta (ZPFrameOutPtr),y + iny + txa + sta (ZPFrameOutPtr),y + + rts +*-------------------------------------- SKT.CopyDataInToOut lda ZPDataInPtr+1 pha diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 3222a993..8505e3c7 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -3,21 +3,7 @@ PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF *-------------------------------------- -TCP.IN jsr IP.FillSKT.TemplateSrcDst - - ldy #S.TCP.SRCPORT - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.DST.PORT+1 - iny - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.DST.PORT - - ldy #S.TCP.DSTPORT - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.SRC.PORT+1 - iny - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.SRC.PORT +TCP.IN jsr IP.FillSKT.TemplateSrcDstIPP lda hSocketTable >SYSCALL GetMemPtr @@ -96,7 +82,7 @@ TCP.IN.JMP.LISTEN stz SKT.Template+S.SOCKET.SO stz SKT.Template+S.SOCKET.TCP.STATUS - >PUSHW L.SKT.Template + >LDYA L.SKT.Template jsr SKT.New Assign OUTNEXTSEQ bcs .99 @@ -505,27 +491,7 @@ TCP.NewFrame ldx #S.IP.PROTOCOL.TCP jsr SKT.SetFrameOutDstIP - ldy #S.SOCKET.SRC.PORT - lda (ZPPtrSKT),y - tax - iny - lda (ZPPtrSKT),y - ldy #S.TCP.SRCPORT - sta (ZPFrameOutPtr),y - iny - txa - sta (ZPFrameOutPtr),y - - ldy #S.SOCKET.DST.PORT - lda (ZPPtrSKT),y - tax - iny - lda (ZPPtrSKT),y - ldy #S.TCP.DSTPORT - sta (ZPFrameOutPtr),y - iny - txa - sta (ZPFrameOutPtr),y + jsr SKT.SetFrameOutTCPUDPPorts ldy #S.TCP.DATAOFFSET lda #$50 Header size = 5 DWORDS diff --git a/LIB/LIBTCPIP.S.UDP.txt b/LIB/LIBTCPIP.S.UDP.txt index da41c9cd..a7c9f097 100644 --- a/LIB/LIBTCPIP.S.UDP.txt +++ b/LIB/LIBTCPIP.S.UDP.txt @@ -3,21 +3,7 @@ PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF *-------------------------------------- -UDP.IN jsr IP.FillSKT.TemplateSrcDst - - ldy #S.UDP.SRCPORT - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.DST.PORT+1 - iny - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.DST.PORT - - ldy #S.UDP.DSTPORT - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.SRC.PORT+1 - iny - lda (ZPFrameInPtr),y - sta SKT.Template+S.SOCKET.SRC.PORT +UDP.IN jsr IP.FillSKT.TemplateSrcDstIPP lda hSocketTable >SYSCALL GetMemPtr diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 46b8aead..cdcc0a46 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -287,9 +287,9 @@ FD.SSOCK .BS 1 S.FD.HANDLER .BS 1 S.FD.SSOCK.HSKT .DA #0 S.FD.SSOCK.OPEN .DA #0 S.FD.SSOCK.CLOSE - .DA #0 - .DA #0 - .DA #0 S.FD.SSOCK.STATUS + .DA #LIBTCPIP.SKT.Read + .DA #LIBTCPIP.SKT.Write + .DA #0 S.FD.SSOCK.STATUS *-------------------------------------- IOCTL .BS S.IOCTL DCB.NIC .BS S.DCB.NIC @@ -297,8 +297,7 @@ IPCFG .BS S.IPCFG ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE *-------------------------------------- -ARP.REQ .EQ * -ARP.REQ.DSTMAC .HS FFFFFFFFFFFF +ARP.REQ .HS FFFFFFFFFFFF S.ETH.DSTMAC ARP.REQ.SRCMAC .BS 6 ARP.REQ.ETYPE .DA /S.ETH.ETHERTYPE.ARP .DA #S.ETH.ETHERTYPE.ARP diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt index b534e4c2..eab9de88 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -108,7 +108,7 @@ CS.INIT >LDYA L.LIBTCPIP sec rts *-------------------------------------- -CS.RUN >PUSHW L.Socket +CS.RUN >LDYA L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcc .1 @@ -122,9 +122,9 @@ CS.RUN >PUSHW L.Socket jsr Init.Timeout -CS.RUN.SDISC >PUSHB.G hSocket +CS.RUN.SDISC >PUSHWI DHCP.DISC.LEN >PUSHW L.DHCP.DISC - >PUSHWI DHCP.DISC.LEN + >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Send bcc .1 jmp CS.RUN.KO @@ -159,9 +159,9 @@ CS.RUN.SREQ ldx #3 >LDYA L.MSG.CFG2 >SYSCALL printf - >PUSHB.G hSocket - >PUSHW L.DHCP.REQ >PUSHWI DHCP.REQ.LEN + >PUSHW L.DHCP.REQ + >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Send bcs CS.RUN.KO diff --git a/SBIN/HTTPD.S.txt b/SBIN/HTTPD.S.txt index 501a5f4a..d9509c6c 100644 --- a/SBIN/HTTPD.S.txt +++ b/SBIN/HTTPD.S.txt @@ -98,12 +98,11 @@ CS.RUN.INIT ldx #3 dex bpl .1 - >PUSHW L.Socket + >LDYA L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcs CS.RUN.RTS - txa - ldy #hSrvSocket - sta (pData),y + + >STA.G hSrvSocket >LDYAI 256 >SYSCALL getmem diff --git a/SBIN/NFSD.S.txt b/SBIN/NFSD.S.txt index af679a30..aa3bb6d5 100644 --- a/SBIN/NFSD.S.txt +++ b/SBIN/NFSD.S.txt @@ -85,12 +85,11 @@ CS.RUN.INIT ldx #3 dex bpl .1 - >PUSHW L.Socket + >LDYA L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcs .9 - txa - ldy #hSocket - sta (pData),y + + >STA.G hSocket >LDYA L.MSG.INITOK >SYSCALL printf diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index 1ae2a69c..8bd155b9 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -11,8 +11,8 @@ AUTO 4,1 .INB INC/ETH.I .INB INC/LIBTCPIP.I *-------------------------------------- -TIMEOUT.MAX .EQ 30 30 sec. CONN.MAX .EQ 16 +TIMEOUT.MAX .EQ 30 30 sec. *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPSktPtr .EQ ZPBIN+2 @@ -23,7 +23,8 @@ CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 - .DA 0 + .DA #S.PS.F.EVENT S.PS.F + .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS @@ -44,7 +45,6 @@ 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.MSG.BYTE .DA MSG.BYTE .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP @@ -54,13 +54,14 @@ CS.INIT >LDYA L.LIBTCPIP lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) + clc rts *-------------------------------------- CS.RUN jsr Init.Timeout >LDYA L.MSG.TCPWAIT - >SYSCALL printf + >SYSCALL puts .1 >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? bcs .99 @@ -78,9 +79,10 @@ CS.RUN jsr Init.Timeout bne .1 jmp CS.RUN.ABORT -.99 >LDYA L.MSG.TCPIPERR - >SYSCALL printf - lda #K.E.SYN +.99 pha + >LDYA L.MSG.TCPIPERR + >SYSCALL puts + pla sec rts @@ -92,42 +94,46 @@ CS.RUN.INIT ldx #3 dex bpl .1 - >PUSHW L.Socket + >LDYA L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcs .9 - txa - ldy #hSrvSocket - sta (pData),y + + >STA.G hSrvSocket >LDYA L.MSG.INITOK - >SYSCALL printf + >SYSCALL puts .2 >SLEEP jsr CS.RUN.SERVER bcs CS.RUN.ERR + +* >SYSCALL GetChar +* bcs .2 - jsr CS.RUN.CLIENT +* cmp #$03 +* beq CS.RUN.ABORT + bra .2 -.9 >LDYA L.MSG.SKTERR - >SYSCALL printf - lda #K.E.SYN +.9 pha + >LDYA L.MSG.SKTERR + >SYSCALL puts + pla sec rts CS.RUN.ABORT >LDYA L.MSG.ABORT - >SYSCALL printf - lda #0 + >SYSCALL puts + lda #3 CS.RUN.ERR sec rts *-------------------------------------- -CS.RUN.SERVER ldy #hSrvSocket - lda (pData),y +CS.RUN.SERVER >LDA.G hSrvSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.AcceptA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Accept bcs .8 - pha + >STA.G hClientSocket ldy #hSockets ldx #CONN.MAX @@ -138,15 +144,12 @@ CS.RUN.SERVER ldy #hSrvSocket dex bne .1 - pla - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CloseA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Close bra .8 -.2 pla - sta (pData),y - sta .4+1 - - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetA +.2 sta (pData),y + + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Get >STYA ZPSktPtr ldx #3 @@ -157,74 +160,32 @@ CS.RUN.SERVER ldy #hSrvSocket dex bpl .3 -.4 lda #$ff - >PUSHA - + >PUSHB.G hClientSocket + + >PUSHBI 5 >LDYA L.MSG.INCOMING >SYSCALL printf + bcs .9 + + >LDA.G hClientSocket + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.MkNod + bcs .9 + + + .8 clc .9 rts *-------------------------------------- -CS.RUN.CLIENT ldy #SktIndex - lda (pData),y - tay - lda (pData),y hSockets - beq .8 +CS.DOEVENT lda (pEvent) + bpl .9 is it a TIMER event? - sta .1+1 hSocket - sta .3+1 + >LDA.G TimeOut + beq .9 - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetC - bcc .10 - - tax - beq .8 NO DATA - cmp #ERR.SKT.BAD - bne .8 - - ldy #SktIndex - lda (pData),y - tay - lda #0 + dec sta (pData),y - bra .8 -.10 sta .2+1 - >PUSHA - >LDYA L.MSG.BYTE - >SYSCALL printf - -.1 lda #$ff hSocket - >PUSHA - -.2 lda #$ff data - and #$7F - ora #$20 - >PUSHA - - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.PutC - -.3 lda #$ff hSocket - >PUSHA - - lda #'/' - >PUSHA - - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.PutC - -.8 ldy #SktIndex - lda (pData),y - inc - cmp #CONN.MAX - bne .81 - lda #0 - -.81 sta (pData),y - - clc - rts -*-------------------------------------- -CS.DOEVENT sec +.9 sec do not discard TIMER event rts *-------------------------------------- CS.QUIT ldx #CONN.MAX @@ -235,7 +196,7 @@ CS.QUIT ldx #CONN.MAX phx phy - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Close ply plx @@ -246,7 +207,7 @@ CS.QUIT ldx #CONN.MAX ldy #hSrvSocket lda (pData),y beq .3 - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Close .3 lda hLIBTCPIP >SYSCALL UnloadLib @@ -267,15 +228,14 @@ Wait.TimeOut sec *-------------------------------------- CS.END *-------------------------------------- -LIBTCPIP .AZ "libtcpip.o" -MSG.TCPWAIT .AZ "TELNETD:Waiting for TCP/IP initializing...\r\n" -MSG.INITOK .AZ "TELNETD:Init Ok, Listening.\r\n" -MSG.TCPIPERR .AZ "TELNETD:TCP/IP Not initialized properly\r\n" -MSG.SKTERR .AZ "TELNETD:Listen Error\r\n" -MSG.ABORT .AZ "TELNETD:User Aborted\r\n" -MSG.INCOMING .AZ "TELNETD:Incoming Connection [SKT=%h] From : %d.%d.%d.%d\r\n" -MSG.BYTE .AZ "[%h]" hLIBTCPIP .BS 1 +LIBTCPIP .AZ "libtcpip.o" +MSG.TCPWAIT .AZ "TELNETD:Waiting for TCP/IP initializing..." +MSG.INITOK .AZ "TELNETD:Init Ok, Listening." +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" *-------------------------------------- Socket .DA #S.SOCKET.SOCK.STREAM .DA #S.SOCKET.SO.ACCEPTCONN @@ -292,6 +252,7 @@ DS.START hSockets .BS CONN.MAX pData SktIndex .BS 1 hSrvSocket .BS 1 +hClientSocket .BS 1 TimeOut .BS 1 DS.END .ED