From e4f2c60ada43c77b9ca4d92646e8230824e7fa32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 10 Apr 2017 08:07:14 +0200 Subject: [PATCH] Kernel version 0.9 : -TCP, bugfix (#8) ...nearly working!!! -MKNod API implementation for stream SOCKET -Bugfix in Smartort controller/device detection -Memory leak in CP/MV/RM --- BIN/X.CPMVRM.S.txt | 2 +- Floppies/A2OSX.BOOT.po | Bin 143360 -> 143360 bytes Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/LIBTCPIP.I.txt | 17 ++++---- LIB/LIBTCPIP.S.SKT.txt | 91 +++++++++++++++++++++++----------------- LIB/LIBTCPIP.S.TCP.txt | 79 ++++++++++++++++++---------------- LIB/LIBTCPIP.S.txt | 11 ++++- SYS/KERNEL.S.D01.txt | 2 +- SYS/KERNEL.S.DEV.txt | 5 ++- SYS/KERNEL.S.INIT3.txt | 11 +++-- SYS/KERNEL.S.LIB.txt | 5 ++- _Docs/KERNEL.md | 19 +++++---- 13 files changed, 138 insertions(+), 104 deletions(-) diff --git a/BIN/X.CPMVRM.S.txt b/BIN/X.CPMVRM.S.txt index e3c5b6d5..9d50df76 100644 --- a/BIN/X.CPMVRM.S.txt +++ b/BIN/X.CPMVRM.S.txt @@ -628,7 +628,7 @@ CS.QUIT jsr LeaveSubDir .2 ldy #hFilter lda (pData),y beq .8 -* >SYSCALL FreeMemA + >SYSCALL FreeMemA .8 clc rts diff --git a/Floppies/A2OSX.BOOT.po b/Floppies/A2OSX.BOOT.po index e0bca4c9e625937395ed3ea36a5d8b3330fe7709..a1451e74b4b15be78a7fb5213fd4f7b5039c4bf7 100644 GIT binary patch delta 11077 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 delta 11172 zcmaKS3s@7^w(#sEgog-0KqCSUA&>-l%ERE~)V4kf7AscNw&(OTy{#=+vG!rx-`Y!V z6{}o^3(o0{w$M)Vn;zrOa02bs(|*Oi6==1iHV_aZ*osgkj#hz!lDqbVhuEH<@5}7j zd$0Fid+oIsW9s%Zb^F;PWzt=$P-ebN9SH60SmGywzyqsg^U@~<3h;}BIJ@lO^~4>2 z!RrY`5E2Y7;$bkR=J$9%uDw6^p*!(*{sG?Q-{YNKUa<5IG$MH55Ad>m=1mGN3Sjj4 zo#2W0EnL0!k>s_Ht}R%;3MhK65prUc|D@m~7QD`9UeJUl;*5kr5?zBl@*%H*3Sxr) zkue=*b-@%XOk;Ke5&z(-o*|uAoIwE)R0h{p%m>RSi;7aN_R=vBg}yfWXN1w;uoyA3X*7Ki^pHc_IUdkyKABsjeGA+^y0M8`*@<4iF-{Gy~VgE zuTQZ24agl=?^Ex`54LN3{!mNHg z*6+7Ykwhf3{qfDHhq?6lXvi-b8=^03ERxS|XzGcsAr15EU(-r{(exrKYHs3>D2?nJ zwnqArro2}})@$6C@zcn9>IwRa#){|x4g2};=Qm%`U=U@Il-{YK_iMbcyEOCx4PcNS z4>6*#$8#Qy5MxUN_OzcC5Bh5D{#>Az&g>iKb;_gRFB!SrJWMM%&v^Y+u*LKi#i+vw)g776*vY5S{O^J#Jm6SZ+2dWU&wV+>ltyuDGE zb+MHMuxJ1~t_FyGYVw0tyAOHfw9=S^F_yFz>Wx;la-*zNtv7l#A)jGxY_9ayG4mKUPvDDb&qxs*-Toj^^byA|V$Qh3=EkdIu}1Ck_K5E31+; zmBG(OR7q^o99t;8z+qcKCpu~uIJiW|_j(8Kb28f@XviRkNML1Q5o-3Wl=S=NxDzo* z^V9rU8vz*Z1rAd)J5N$CIoufS;Dc-R4&Xb5_eL}`0P-zx>`@F?r#Pxp9ozy3o#xQ@ zn{t2-z0lFWCWlLM(CLnTB8N+cXXRWv*-=O*!7mYh3mong2jA>Yb@1O578X`#II1%p zT$+Pk1Vjuu98ds6j9wWIR0@G)Auw=fIQVvVri1^nu#hWRq7sA&|` ztArZg^v|=v-;`+hx)U%hCv6BIjWFq*a)Po&ZKBSbyv=joX0x{`hK4I*^v@-g zY-$79IcZSwb8XlFvY_J4ZNS|=!*a?d!9;C8B-*~8k{+}BL7ahTCJm~U1l7rcjGzWg zkT0~^6X;`Y<&A9>pSM{~d%=`?P7*ZG*v4Zv1IOBUIdB>HyiJKM5=w6A1OduXkmbv9 zC7xl1o{LA%FwvXi&^l(>=10*M=Dp1tbdfo}Id%!GNBG2g1dguq9~v;oQ-{fb&Io!|kS&D{4PsHf3TQoJmp?VMEtXr+=$Nw4(O zfRlfVmD?2H1()`1AyF?AvnA`k%g#M5iXmXf&vCn*rdi}Y=k!L_*CMSaYP@sYfD<+Z z=Z5E@K3>`+baGdm^e;|u2`n|Ue@k@9l$;pC6asvUFFVH>|KjAo!g3qEcnvaPsZMAX zcptLxoJrN(&HKR%`P@0vY;y1%IdHB)2GcxD?>J|Yl6%g90Q!D7`J5m_KS8^lGY6c4 z^3*R*A=D}p`D~I^9`5xqeJBbKrXRPkMaud%UUpUySVfrQE;$e9CHQ$iv|D4sRA&{TVd1mq%qKIFQ)Y#RWoE%q z_4w8-bdCAjR^4B@&hpw$?pmk5Kk{&4p%on@@;n}};ER$X5={6F9;v(5X>3qeT4x>3|7r9vU_XfhB+((qLQgA?L*I}TCLlI1G{b{W? z7O{c#S|#Rs*40$6#e9Esac}mFGvs#mcv*4|mpJr;i)(e^As$01i+^y@r(K5tteAJv zXPA{Q8hv?Jt|y24fvJCSq3@WBJL9T7&HVDB&d}znB0%6`C$y|05q2G%l_7)>x~EK8 zeCK47>EeDps7JsSLJh>q!;RaS)i2E<&${XfU|ktecEy2TTV3|xGQiw3PWPkTFP-vD z3=#J^vdMvq#OA3Y%E0GrNc0wB;)y*jvtl>1^Yz4(-EHErZ?vcrEo7oamS`a=zGVf0sR? zD!M!9o(|JI==F6ggzB2^j*5r6J4}Du10#aZV`N>&_B?q9?nvRCJCEC~Kf!%tCN@@3 z#rcjp7mVc%wbz~RFp^)Kt5mSvwhr>$b9UcSpItKY0`t?q?~oliN479emE2R(+Swr4 zCp%OxsgmvCe(RNC2#7j@U-f8!TQLE2E7-iqK^-K;+Nw!mI1WCFPuYuH{ zr=vNgGOT&AU7-smKWVpzVRm^J0LJ3eHF!?&X;BR8jb#CccicLc5WD1Fb&OwU#-h&b zPDAIC&igyzpaP^#7zyI*zmXR@fi1i}BHHp{Fr%zGxKtQ7#6 zPfbs*Ug@fEA0tn6m8~MapsyaYtH~Z$<$Us&_n2(JLo9D6eY1vBk$Mi!ihn31qChVFJj{9_fiu+jy)61e~D zp}nkDHzX(wdyTw)ub+?s)Uj5e0-bXnbPI1Fo1OfaMFzAX8;^6rj4mnn)^0eG7Ps?5M zY$TL-^#2SmJM@`FJ@@ym$0Iy(aes2Caru=0>LFgi< z%d^od&-Z>2CCy4NgO^E`+#H*yt|c#%88P?7yb$wQOo95Z>a}t8ai8nDb+w7lCdre( zNKz!DfMut&4d|VerYaWdvkqXFik3W?C}; zk?G95ndy^75Zr2tj|1vt0WJsl;W*Be_0EdSr`)S4rIE|01Rt>q0DD(Lrp4G7Rm@@j z*-Jh(5YtTXzTJMjH1FL7+#G`lWYpaYp>k0yX^SVX$LBq#b3aV+5$?4V_b}D$;nq_9 z9{UU%VfmtBEk!>}8SBIurP12U%dM9L`SDA~du<+LURsQWeNV*gA!9;yARZ$UkIEK_M~TFT^fhyE{|2|3tbK@tO_>&B z`hJSpIL^30UYv1(Or$j?&rb#F*k?5iE7IA3`r!iysirR!{GifUVv#l;rfRO~L3VBx zS)1pjZCBU=KoPJH1W{{@?SJ&+x|ja8YZ#`&4GqIW2;`FffPH$Hmt*a~{=+!69)`T& zw^QK;9dc*DX3d zrhH)x6cN&5N}#;_w~ihhvG~C_S3rS#J)2ZrKymBFU)NDwO}3x`(lyyN z3$k0DR18(?va1uaAt7EvVt?lHp&@G%?HLt-_kkDq0}=RN!}?XMqcC6aod?OMSc=j8A>jTx86K>!<*F3 zDPvL9Ft?xDH_S>t+0Psvn2*AlmVt%vygd*Z_6}@dSm~4RQv58N34mk(l;qZwgd5;q zE_wzXYM{fgW8JTaV`UbpzA?mbZMX?Mvoaj_>xXN=TcB(G?ci|f=&lj$Zh=$o_ANFv zb~W-sJlJ~!S-YOR(_h1Yh)h{O+)q>iResPe1;Clph%nvm*%Ww3IC(MIt{{Un*gSr? zBZZFANJD_arO?uzUEOR-eYegeyul{cchm1sP4Ik|NxS;!!fFZ&+0SG_rw{h;|)qyVF{@3D~>bJaj+BnisKD*JQ$h3%tml= z23+?6%3S>T8|}JAJJ7x^Il##tHbxt& zgceBK@DkNV7=%BGQ$kiBH_xC8u8B6V=zAE}HUVUGw80*QAIdl25gK4u!2Bl>00(_| zt#rULM;jpCtLwX)i4vix*^mDV8#{4etl87T-(=OWsNK_#8-ReITh)!1@?V}k5VXPF zXr;m0bFjMZi5TkWa3D@yKi1$N%-S_g}adViWUv-+s1&^`u;5LO- zeMaz@ZtNm??dK=bt?@E<8j!hy$p@+%43AJ@V*_S3Ts)uKmMYYf#|11nKB)sJ}H zau2+SZdvK)));uHTWhe6D2pVeBfxm{Bpftnt)nMr8~E?RW0l1k0~BSzV~e%$GI3OQ zc#mq)x-~zF9V1KD_c4#$h%Twh{?pspd?*<7x@iBt@sr&&15AA&8+u@BoI3qqv4jPU;CC|Na9)>JhzX;(OnAk>8$z__=B z@G~QP3>bIh^sN$pEqn}__9%X97=fEcJf!_25C)>j>kI8#nNz-83abc(z5QACaJXhmss;hm-*gyH z!CmZgy-`=ve6Ky8Y)P`ukAWlv7F&n{YT-a_aIb_PgT!diA5{%P1(Ug%mIQDz>(IeL zFW$nONv(iSp%7VpBWdN9$scp==G+lIuXDw1=xiGyBV0B zP6CecU9zoFZ-lI1@UZpL!CtaQ1J}fJ>E!iva9yJ%WMWW9o@0&;s#M-_4Bsr{gUGki z>^@{}7U)LkjW!LOr7etPNP`qi!qCE0;OYz9Cb(43HCWJY_tRJF9wT>Osrxgzdw{G+ zffBC5VANMCx6EbAhoa#!`2U6?Ld>Z~EEpz$`s|Fip7iu;vm$D`g$Q)1|jfCt;~?Q2L9#^bJa+ zL*JyhK}xx?mmZ|JA!_3#dWceT!3G!zHgG`(7zi@J2AGLAK%gPdoK9{}2aK6R6fXh0 zh13svcP~B{N0h|^2vP!)T%$^FTisBsv|fd>&(mX1dsw26_bH4J@^d(WS_LBdao4C- zzf!_I4YzXK0>wwUuTd}rBG0V8HYKvW_ZAOsSeQ81ppZ4s6oRX+G{L|??-*a#>oFb1 z6R8`lV?G{X4d|xaI9B3SZllMmoc`jNSGkKGP>!2n01$eHfeSDIL;zOKA1mi)AkFEb z_bI^pag~+@4Yh zufdqO24j>+lJ-!X1f=SvB?eB4O)fQXgg8JLID`if7A`M0>vz0Iyu3%JnHx;a6pzd) z8No7)QrxIlhS57@0Q&liZd#;&@hZ@V10e-+pZe~c+cEs-(28192UO5ILKm^1WJF|To3S*uejaxFmQJ`u( z9vBCS72_*mAEW;(y}TmbGQZK|sS$A8oHqH7^zu49DNxL}qc3M=CE~+x;s~PHc<8i? z=aKXG$I)`w!1qDg$TQF1ib6a?-&(ll<8-)d@l^F`s`?BCS?r^tX51stkadan`^$gK zpq&|I__WHhc}fT2H-z^qn74?i@iWu}V%uJaH6_1^vCSg)Gm6{uO17uN%_c?P=m%L3 z0IlifLjX#!DR4OTg>WjXf~ymo1}B?>j|H#vg3BVx@Aa+2nK%zS^FL@Stq+mY}L7|TkA6QWl? z5N;^#wM&j)vUV$r)H&9kBI0nNvN+sOiTX-^-hB~o9B|)Sg4r@Quf&~YPaqQ);vGhQ zm<82nU+{1@?Q7uVhK*NgIo^mqcq7VilrhrQET{z%B%u9j^RQ`EeR~yHU$Bn%7=+G( zM%j3WT?o+(XN))CNzz(4eSptiB*?*RzEy*)G#D}((8?mm5q^;v%ws~>R9ilzty9R% zBOY~B94J>LhkTTcw8-vGQkesu$iH~gR)|8Q-k7GynaCBIcxUgZ=|^wkz-IhGE^CA| z=>O+_Z-=1yh<`f`g{mR{3BpJ8jenK-9OdS`U5FMuF6PihA^$>TZ(gk?RWU-`L~?^e z=qQXpf=`$vQ_^>U^sQ{dopS$=fQqFbDI~4PER!Q8t~Z(I%hB|LlXm z@e&sye;3!zrq|re*}iD%!yZiPsL>Z4N?dsng^GBIQV#Mv~(9FSRanegvA0I?Y8HNP~Vd zS7o3uliEH4*QYCRAgcsFOahbVTxRP$6l?a^ zBgKbVNOE+p9$i9E$((y+F^UZEF6FY{E#EB>sF;*>KHBF3TK<)m!sMP_r$&b^pZvf(~Rg?bY)%|PGysvD+lZLn4}9ofLm6F5X`3{?U_bkWC`#R+~p(MhW5YZzPKe z|3m9*6_iDZ#!6(Yc*Fcz0ZK!p*2=_}DQ4$76bsF* zb*K_?N9pzGC0rTzIr13t3(L;%^Qx~Uza$6M!)i+F&<<#QbWyr^U5akP0MF}018miu zdR`|y<=(2}wwmwT0tU#?c4e5K+=6DS7isS>K!9ifZCs_z$g02~XT-k0`Q0rj0{NSd zY(Y<=6Xt;<=mGN+&m*Pc>3D3GuQhf#8K%v9CC2>Fi)g9&{i7)OX#4Z%B?($@UiBif zqZ3ERUPPk^eQh3j87-JH%8Iy2qY&mL+rTJKnP1q3DkNiZX7maQM}IcYc?B(<^(d5k z?zGW~cyq-%lq;F3F}JTnD%{>)hyK$iiH#vE&Ck7x;w6}S{_QBzw4vo>e%{oPK5k;yM3y}OM;l2?zE zA-}}z8@^M{bVU76^{D1;EvNlf+okQ*Ue!)GQ;OG_Qgx?NursCVxKyt*-OzO1Fh6+& z&5j$={LY#B)YF}*InG?Y1l^{Z{GGPdK|rV^z5go7onY^H_e{hV)7|(`XbJJ?>3YQ0a~L&+ATe z?{cTN#@*>;yw{zeoph&suRG=6=}za4c72XwC89fhg(Ag+`sn-)bQ|F~e{_E5QK=6Qwpi!;?0!fhjG9l9{^(ZQb2YB>w(`{{`yJ!#Xo?T)KE>eaK zX8WJI3*Gs$(lwT`0b6aq7R8eU6-R9#ARu@kRE?=s#FOuNC-Lg;{`JRuJoo!N&wEbv z`V_rB#j;;4-W(YlWIQZ>8yXQo#!Rn;&`6tNtnhkUToIW$e%F1kuRoQhdSmZL#!92G z^BC!7*tSdho-Y6s9s_q()IaMjeLV!A84sZmLAyFWf0K|lry&7;9sy}nb}ioN28Nu!{ZvBd!6lIQk3Mw|XeMRDL?z;TdadD~6tTN3fv1ax+ zo(9t8m^#rH&nI#OM)4 zJx1ZU|LYM2B9Rq~Xj(!4L*b^aR?w^hahxy@dL)jGVPd5vhVxarBEXOUB?*v8 zQs#s&gI6J_r4H$ZHwIWd*rWh zaHZ1pTht6>gTR+U)0d6e)wTEk;rP8>Z?#M(@Y}|Z4s4jLwOcmOwv#4;eD9>?H=OMx zxz0HGU?Ki@WAVWVe75nUgQ|?d4id=1fb57ID7MH+Q-{Ti+?tKO)oe9;E|F?LURmfIABn ziSw3}>VZ?_Pd%21>T{=P|I<}|rz=euIq|ebLfTJp=T0HT=T4DtoiEDf28^yl@(F&Y ztq@KB(=d>UM)I&yo@sBwvfo??|5&1iC{l%6YX~mWZkuPuVi(}WleZAG#`x>QAuq() z&GYGadqbR^i?<)s*m}U?R^ZpGQJIH^`_I|kW++k&DoV`LiTAO6AO}2A!b~?qb9@b}r7&_HHyd;}Tu+wSw zVJw?VgwimLPP7-%3Gf#We{ptalAX6XlkNPWqN1YObbD=volCLPY7jzYb07g25xXG> zq!fY3B2eH=xAR@j3_JgQQ4v?FwzJ+fMD0vFm;Q(`12GyV&>29VZgs7 zG*c*(?6P8UHkWKK#ukk2C=wLL+DZN>KS+S zEL5gL=5eHVvmql++aXOdAEZTo9MwUK{kUg48lEwJ+WL%mRtG6Jo^73qYmK*Blb}>u zLuIo%P`&^v7bU8YpX8w)`VHgDRz=pK9#flM0{yDLb(oHl&pX(^nL9vo72yYSS?pKq zSNliQ;4F=VBDYsT=#_E9yxE& zLB?MYb`YWwbNS?)Glm|GT|Dfl{lQV|bg)<>q4IZ4aylLA;@Ks`4tm%D>(md9Phid3 zZa7C~pRt^1LL{&5AjkJirvv=ViS%SY7H=fBPWA(kwT-_)I*rWHxzinI>Iq;gCk(`( zsNLz{|IB)urC{8U@#awyzhs|cfa8W7J96SLWOJ7sXbIH8 z!uf+kSU-n_$~+rZ(aduepXwn;xlft5&V;ra$tG}>>f+oGw|!i&Fw0mojp}t4|m=8O?#N;dXKJ2UVXiX{;|h1 zswT`OgC>2Yr|L3L^{9tKcEE!5V^7Z57?hC0w4=AG(MzN+v0p4djr-h#cjK>Q@nAa8lQx~n()lalZI=#IXk5_=!r*;nbYB>NNfRe(GC zimn2@tB;kyuD=E=CtyoigO`iQ((XRa(c943Yg&wUt}w2vm&_EhzX|gtw_ug52-2~u zcLxYWOAVkQF2Yj7PH0rhkk;?}tc^;f*WSl{FyK+heK_D&$#wJzAij_5>_ecFh)Pz% z_tB^Nwo8Dn*%Y&z~YiF; z%OCX+RDbakH4F%Y8H6`s3wJdC;jBfB_C}TeW{E37<&zCj#dcV)eBalIfqKLA$}1hH z+1Y3DuPkx&Rd_`2`oqa~pP)ct;^SuT8jK~(V>MVkz6~?J*fkB`Y~0Wlm$o382PTLxXU=ywE=H4uI`qFwsyKA zw}{cX5gbaseA<#z37eRh^#Q;Jqp^Di-fG;}JymS$Y_J-;yBDOib+QsNv#SYHiCyDZ zA84}PsPICC7z#7C1(WGurMjE*)_F5Vwiyf0yrDSTWx^m0y~)d6L;Ogkj&AQF&vtR` zT`sABkoJ!ur1AWj=+blD==5BRO{^X0u07k$VzuYHYx}!DIYqcOSQ`nOf*;47?OrfO zpY7KF5O=m)>bDb{IOJMYhfS=;Ch9wP_IL9WY;t~>9_Xg~yY)wGf8c#~p6_-w^9tMh zE;-rSZSaFWKW(V`d^dfeTOSO)p?;~Ww(fj)b>8`I{a-5p;_`ZdZ0!Dhj&C>Wh@j1# zL-kwd;e8M&)Ic~=v$Iiq? z&6+Kb7~eBDDR*5{KB*C3(vZWn_@TXUCTF4=FeY%S7y&2>N^U1NnDXA7Pd z*6yLrUp#MVR>6Y&yo9B|fS8i8&=bt;{dfq@GcWJQ<@ibF15}-2{q=2$k`A|V+D<0u0G^3En8gRc#xCaV19&9f&HNRrX=i|Q!QzC1f}EPi zhN`j99_GXW(A>*hIe-VN``lEEm*yAb&&kh$d|X_C$TP5zvp+)>&UK@bXJV24%&dcW z1U|sLauAm-Kj)@|NIan`IRo=LkKB7fz<&JLh?FEua?w44>4OM4Cl~C5AbC8xVDXG3 zEc6m{;vm>L#9TquFyng&4+;L^A^DvAxlfQMV_}z>*@wXQSD4j@@NoPp^C#$eJCXit z%>Nw11ASd?jUhiWdk^8k_;scms*s;RAPg)4;`w|*wva{0Z8OraxEsu*!}yHIn;;`_ z#7*W21K=SDw>$zznbn8!VDH;NQZR=(dkCLWdPit4PH@k@C#448^`P8yCfJGxhXyxH)0kMON~e2-|& zUzk_m@hh@PjfDk!kXcKAj!aI%yh31%Q$pP&p5#D$5G_fVd&pD6Jpz`X3{S`sq$guC z@)0-|!Sj|0K1{)aBOW0Td`@0g?z|7t2-C4?k<2w4E=!Mkiekm0W$wi-8JjMD3bVLi zsT-4mO^arzHe41Q^Ay3drOVxmbSf6CVAi$a(}R@{3Fg4o0};)0OTZ*5d{0C*B*|yT z@IRJLZS1$&fjAIpZVA&m%1XO{3COc3k7=*3(*RiY4=COyA}% zW`8y@H8Y#y;r{#t(HK3KqUTYjaX>js8U@c@qw1@3DQn~C)p?X*a^oltZFG?kMa!7IONi5`tv#l#J+7^7M{(N} zZCM5*`A{p2WSM(FOWoBgnl0(*{Zyxc@x7dY{1OA*vj0N+n3T!OB_d~@(4sfWC)IsG zw`$4nq79SD=VR(`ZoA>W_)e{4@tRStRl8-BCBA88{*_CF5tSpHPn1_Fmz);Kzh)qn_o#3BO1`cYZ&gz{0i?%r+( z8Ssb&2klXpmoO*caxfGq&_ySwXvUW zV-oU-RVhcc$WE)(guy&Mp|uY6i}{-*5%X}u>zZ!3Qf;#=iQA{sdXrYBQ|qd$l;zjToc-RAFd6y@{ga@M)r-xMdW@dMJjf^F@I}mw#YD^^NPU7& zWc|#NnjuJ{njyFm%!4wBTTbm)VHrVN3yD#q58|iSVhecxlXP3vEe*iLT7MjwgPQIoMmeL@U|gg zZG-p3MU>0iw51fhD$_MUCwgbD7B06uVZyHDXkAkpa<$dD+O4Z0@3*ei0{PZF!B;zT zv{!Pqu0_pxT6au_%Z32fyjpAf(jcfA|45BtJYecpYx~wh5+WktK_8Bw=}|>g=P=(c zAws?Hs|=!?-!XmAE?q)F%<@?b9w~CEPfp!%$*qkyYzeLaTarNySJ||Fkt=DaE|=1u z1A-UG!r0#%PU|XN66it461Z~-1z9kW6*VuRYFuq_Nkma@$faD*2q;&^5SK@({Ogub zEPf2YN-I!?Euk!-P?TC^??ZF)IExerzR3kb=tI+Bhg4ZYLGH?7W5Ha-HVOX{8-=!$ z-WCnNq@s<#$;u%s`q^+{kMZmmKmnUTO~0^tOcXX8&*t%HgAuk7NLhLjRlj0jTYout zHOHWQl*FVa4xUAEid919`$3NM(-SGK)DwbRWh3xBGUAG`iTF@f+&I!TrsV^zEfSuv zT3h^hC&(ecXMQ{{nk+iXEo5F_MyT)>#;}YC4EQt_GDwtjeI{g-h*ZNy$?RT6kTBEH zllhuqdI41{Bx&snRPBotOUSH^cifp;0SzHj4HD-I6fbhVNY&qw6%*xmV4mMS4)gqU z{oUgWDE=5Ev8?0;3LbhPiA!FDhR)+6UrO+b;KVwS(9yAE;}BC=K!mMr(L8fV!%qg1 z>w=$$>fA2Xj|Z1pHPC~pME)w$;%D-LC)r-DdveKiGK>06`nmWfdHEgm?V|kdpq%w> zyi+mh4)04oAZzYaT5Ik+@*iw$uoPx90|i8AL^dTIUw?nwz4EcL2i4hB{XJPRS$+>j zbbqLSHs8u+GvS3qaQe7Zi_$!n6jVR9?Lj#N06qYGonZ-r=QpBegv+LU^*ay>9&Pri zb*fU^Y)cGzoLN^$kofD2p^!+9KOS!p*WcPU;>MP_4(!{s^$*t9hFShav}__c)I0;Y{p=Mxmm4) zBf`jz`b*me$qNd2KKdz@9G3<;rZY`?2vm_jF^A8IBBDGP#9Nlce7k~(PK}~2403Yn;w8hI> zUqC9{WG6L_xYr&SGh|#z1XX^o{%%Pm^TjGc@md7MUvNfJTqFhav%5ADk`kfI@9U4l z2`Y+GUmT>PC_ywWr?_ZJwq}ryrnnet%_Ta9l5rUn05T{p9RboQ$nG?h-KjA1$t|hC zFfoSt$4X*~Z@618Nilm@62UXWsa()4;Ycbsl5#!UbT8W(PVu2mk^&IeGO?C?Y>W5c zJsxtZC@zPQu7b}gIaJb$`UhTPt|efiY|R6=iEGB(CaNz!aGQ8>3{2#n6DXdexGV}N zvXF_hk%_Y?@{3e>@*44#){H>FJQ)aH1;cm7BabF9HLHjzk{NE(;{=zL&Ok1UqqsP? z%ivc@E=#7k6y%{4ic1s#i4>QF07=LS9UJhoD5=~kW2y4{ z^-lQmQ-2Mf%~@=S_hJfPAc9I&$cR{qi**|j`-BmoKz-3k3koh?0|l@KC&D?Uu|NC% zOsZ}!Ra7?^75%d!X_+12)v*9DY0nM5^S;?BlEM`$S8Id8~W{{%)Ze z2Hq^j>Qbq?S;&>wA%1QvhbxC-hX(*qr1QAy!q(UgKLQDoE)dR>A; z;T?1+gd|63+%@@$WEa@IYWzXpBaNb*V+=hYLTm2M0Z|B4M+Zb139zgWs;_2K<%1UD z$ff#zS+P93exMlJQ6wwLrVRK{`Grjvg~^^oH6$`QtBK&!(3zH4a&8JzNFK?6Z%)rb z(mUyADef6+%{BTNGzlp*3AI!Xq(6N)1K$5J64-t+kFm)$LogbDJ+kH-=4tozsYMkFA9%@GfAY7y0EE?@nY7`eNOR1SLGXzPAEadLW+@G z5XG(*j>5&0{+rpt@mNkqN4TON9!RXne1O359n%w!?e7NrJJ{H#EZ<|eAo9m||B}#& zj8Y7Q}!1k zQu4l>RW(McbqEx`=lEaXq(NMiGk2Sa*y-+z6y$>*ecH1|!siUE*?{Y+KVbH3A(HWE zW^b5C&1~C6ET5#0f={C6G2tW*-$Y3#^K!UoA)dx;4;Mv2bu3(Dz?+ztNzu1^=6p{eb^j#EXdW~kCs4}Gy-CHP{4s(ro6^{R7&irc_s zHGnTP%3clgN&_)PPAQ-8#W=wi@zDmej*SH0oD%we%-yMKF05Vh;0w&#I`xQpXf=1vna z<7fU^6#d9QUQFgLA{l;;#OwgaM4Fz@oWV7G4uLYL=5q$vHN$+zm{XlzbTuPZOU`X z%gP(@BQ2CMmR`lLxUb#U`iN2@!H}_waKkfeZXr{J-n1;7A zyKfK~cop*hF9KA8>no7!yA(N#BG_1Fv4zOm1J3_|5C<#V{l(0NQQ~F1YR~CW__mE# z2>uU#IzPuh_W$8%M!SnhB9u=C;9&HB3;_9`0uc7I091JbaEf{R9t7Z2%;NwQx&u)7 zWB~dV?f~4lPxugDiX?5NqcUN_W9!L(lIx=KY z1g16tZ*7*D)eD)g+C=0VaM{CnpMD7(x<8%q=$@#W4LfFL6xk3%-i*mvt8#9Ho44}= zEw@o?8{bBC71V+OGgIHW4fHQ2ow8hDtc05 z)*Tg1N4u#*21HxK|~Hj z!mlY$YimXU3_}v$Ibnl->Wci|ZpAsKhH?@m4wTm~k adu?j>-qh~1sa>+E-FH*_xX;?hH~k;~blLC# delta 10842 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

s~rY90w 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 B!Mgwe diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index f08e3529..8a151cff 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -176,17 +176,18 @@ S.TCB.INFREE .EQ 4 S.TCB.INUSED .EQ 6 * S.TCB.OUTTAIL .EQ 8 -S.TCB.NEXTOUTTAIL .EQ 10 +S.TCB.OUTTAILNEXT .EQ 10 S.TCB.OUTHEAD .EQ 12 S.TCB.OUTFREE .EQ 14 -S.TCB.TOSEND .EQ 16 +S.TCB.OUTTOSEND .EQ 16 S.TCB.OUTUSED .EQ 18 * -S.TCB.SEQNUM .EQ 20 Send:SEQ not yet ACKed -S.TCB.ACKNUM .EQ 24 Rcvd:Last ACK recieved from remote -S.TCB.NEXTSEQ .EQ 28 Rcvd:Next SEQ accepted data from remote +S.TCB.INLASTSEQNUM .EQ 20 Rcvd:Last SEQ recieved from remote +S.TCB.OUTSEQNUM .EQ 24 Send:SEQ sent not yet ACKed (retransmit) +S.TCB.OUTNEXTSEQ .EQ 28 Send:Next SEQ to send +S.TCB.OUTACKNUM .EQ 32 Send:ACK to send to remote * -S.TCB .EQ 32 +S.TCB .EQ 36 *-------------------------------------- S.ETH.FRAMELEN .EQ 0 S.ETH.DSTMAC .EQ 2 @@ -246,8 +247,8 @@ S.UDP .EQ S.IP+8 *-------------------------------------- S.TCP.SRCPORT .EQ S.IP+0 S.TCP.DSTPORT .EQ S.IP+2 -S.TCP.SEQ.NUMBER .EQ S.IP+4 -S.TCP.ACK.NUMBER .EQ S.IP+8 +S.TCP.SEQNUM .EQ S.IP+4 +S.TCP.ACKNUM .EQ S.IP+8 S.TCP.DATAOFFSET .EQ S.IP+12 S.TCP.OPTIONS .EQ S.IP+13 S.TCP.OPTIONS.URG .EQ %00100000 diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 90144fcc..48da7594 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -104,7 +104,7 @@ SKT.New.Listen sec >LDYA ZPTmpPtr3 >STYA ZPPtrSKT lda #S.TCP.OPTIONS.SYN - jsr TCP.OUT.SendOpt Only for CLIENT conn!!!! + jsr TCP.OUT.SendOptA Send SYN,Only for CLIENT conn!!!! bcs .99 ldy #S.SOCKET.TCP.STATUS @@ -155,7 +155,7 @@ SKT.CloseA and #$7f ora #S.TCP.OPTIONS.FIN sta (ZPPtrSKT),y - jsr TCP.OUT Try to push FIN + jsr TCP.OUT SKT.Close, Try to push FIN clc rts @@ -309,10 +309,22 @@ SKT.AcceptA jsr SKT.GetA.I * ## Out : * A = hFile *\-------------------------------------- -SKT.MkNodA +SKT.MkNodA sta NODE.SSOCK+S.NODE.SSOCK.HSKT + >SYSCALL MkNodA + bcs .9 + + >STYA ZPTmpPtr1 - sec - rts + ldy #S.NODE.SSOCK-1 + +.1 lda NODE.SSOCK,y + sta (ZPTmpPtr1),y + dey + bpl .1 + txa +* clc + +.9 rts */-------------------------------------- * # SKT.Write (DGRAM,STREAM,RAW) * Send block of data @@ -630,11 +642,11 @@ SKT.AddDataToSktIn sbc ZPDataInLen+1 bcc .9 Not enough room in Q - ldy #S.TCP.SEQ.NUMBER+3 + ldy #S.TCP.SEQNUM+3 ldx #3 .10 lda (ZPFrameInPtr),y - eor SKT.TCBCache+S.TCB.NEXTSEQ,x + eor SKT.TCBCache+S.TCB.INLASTSEQNUM,x bne .9 dey dex @@ -719,19 +731,20 @@ SKT.AddDataToSktIn clc - lda SKT.TCBCache+S.TCB.NEXTSEQ+3 + lda SKT.TCBCache+S.TCB.INLASTSEQNUM+3 adc ZPDataInLen - sta SKT.TCBCache+S.TCB.NEXTSEQ+3 + sta SKT.TCBCache+S.TCB.INLASTSEQNUM+3 - lda SKT.TCBCache+S.TCB.NEXTSEQ+2 + lda SKT.TCBCache+S.TCB.INLASTSEQNUM+2 adc ZPDataInLen+1 - sta SKT.TCBCache+S.TCB.NEXTSEQ+2 + sta SKT.TCBCache+S.TCB.INLASTSEQNUM+2 bcc .80 - inc SKT.TCBCache+S.TCB.NEXTSEQ+1 + inc SKT.TCBCache+S.TCB.INLASTSEQNUM+1 bne .80 - inc SKT.TCBCache+S.TCB.NEXTSEQ + inc SKT.TCBCache+S.TCB.INLASTSEQNUM -.80 jmp SKT.StoreTCB +.80 clc + rts *-------------------------------------- * From SKT.Read * In: @@ -859,19 +872,19 @@ SKT.GetDataFromSktIn sbc ZPTmpPtr3+1 sta SKT.TCBCache+S.TCB.INUSED+1 - lda SKT.TCBCache+S.TCB.ACKNUM+3 - clc + lda SKT.TCBCache+S.TCB.OUTACKNUM+3 + clc adc ZPTmpPtr3 - sta SKT.TCBCache+S.TCB.ACKNUM+3 + sta SKT.TCBCache+S.TCB.OUTACKNUM+3 - lda SKT.TCBCache+S.TCB.ACKNUM+2 + lda SKT.TCBCache+S.TCB.OUTACKNUM+2 adc ZPTmpPtr3+1 - sta SKT.TCBCache+S.TCB.ACKNUM+2 + sta SKT.TCBCache+S.TCB.OUTACKNUM+2 bcc .80 - inc SKT.TCBCache+S.TCB.ACKNUM+1 + inc SKT.TCBCache+S.TCB.OUTACKNUM+1 bne .80 - inc SKT.TCBCache+S.TCB.ACKNUM + inc SKT.TCBCache+S.TCB.OUTACKNUM .80 jsr SKT.StoreTCB @@ -977,13 +990,13 @@ SKT.AddDataToSktOut adc ZPDataInLen+1 sta SKT.TCBCache+S.TCB.OUTUSED+1 - lda SKT.TCBCache+S.TCB.TOSEND + lda SKT.TCBCache+S.TCB.OUTTOSEND clc adc ZPDataInLen - sta SKT.TCBCache+S.TCB.TOSEND - lda SKT.TCBCache+S.TCB.TOSEND+1 + sta SKT.TCBCache+S.TCB.OUTTOSEND + lda SKT.TCBCache+S.TCB.OUTTOSEND+1 adc ZPDataInLen+1 - sta SKT.TCBCache+S.TCB.TOSEND+1 + sta SKT.TCBCache+S.TCB.OUTTOSEND+1 jsr SKT.StoreTCB rts *-------------------------------------- @@ -1000,11 +1013,11 @@ SKT.GetDataFromSktOut lda ZPTmpPtr1 clc - adc SKT.TCBCache+S.TCB.NEXTOUTTAIL + adc SKT.TCBCache+S.TCB.OUTTAILNEXT sta ZPTmpPtr2 Make ZPTmpPtr2=base+nexttail lda ZPTmpPtr1+1 - adc SKT.TCBCache+S.TCB.NEXTOUTTAIL+1 + adc SKT.TCBCache+S.TCB.OUTTAILNEXT+1 sta ZPTmpPtr2+1 lda ZPDataOutLen @@ -1035,13 +1048,13 @@ SKT.GetDataFromSktOut bne .4 inc ZPTmpPtr2+1 -.4 inc SKT.TCBCache+S.TCB.NEXTOUTTAIL +.4 inc SKT.TCBCache+S.TCB.OUTTAILNEXT bne .1 - inc SKT.TCBCache+S.TCB.NEXTOUTTAIL+1 - lda SKT.TCBCache+S.TCB.NEXTOUTTAIL+1 + inc SKT.TCBCache+S.TCB.OUTTAILNEXT+1 + lda SKT.TCBCache+S.TCB.OUTTAILNEXT+1 cmp /K.TCP.WSIZE bne .1 - stz SKT.TCBCache+S.TCB.NEXTOUTTAIL+1 + stz SKT.TCBCache+S.TCB.OUTTAILNEXT+1 lda ZPTmpPtr1 Dst Ptr=Buffer Base sta ZPTmpPtr2 @@ -1049,13 +1062,13 @@ SKT.GetDataFromSktOut sta ZPTmpPtr2+1 bra .1 -.8 lda SKT.TCBCache+S.TCB.TOSEND +.8 lda SKT.TCBCache+S.TCB.OUTTOSEND sec sbc ZPDataOutLen - sta SKT.TCBCache+S.TCB.TOSEND - lda SKT.TCBCache+S.TCB.TOSEND+1 + sta SKT.TCBCache+S.TCB.OUTTOSEND + lda SKT.TCBCache+S.TCB.OUTTOSEND+1 sbc ZPDataOutLen+1 - sta SKT.TCBCache+S.TCB.TOSEND+1 + sta SKT.TCBCache+S.TCB.OUTTOSEND+1 clc rts @@ -1065,17 +1078,17 @@ SKT.GetDataFromSktOut * Dst : hOutMem/OUTTAIL *-------------------------------------- SKT.AckDataToSktOut - ldy #S.TCP.ACK.NUMBER+3 Get new ACK number from FrameIn... + ldy #S.TCP.ACKNUM+3 Get new ACK number from FrameIn... ldx #3 Substract old ACK from socket sec .1 lda (ZPFrameInPtr),y pha - sbc SKT.TCBCache+S.TCB.SEQNUM,x + sbc SKT.TCBCache+S.TCB.OUTSEQNUM,x sta TmpDWord,x pla ....and Set SEQ = new SEQ - sta SKT.TCBCache+S.TCB.SEQNUM,x + sta SKT.TCBCache+S.TCB.OUTSEQNUM,x dey dex bpl .1 @@ -1134,7 +1147,7 @@ SKT.NewTCB >PUSHWI S.TCB ldx #3 .2 lda A2osX.TIMER16,x - sta SKT.TCBCache+S.TCB.SEQNUM,x + sta SKT.TCBCache+S.TCB.OUTNEXTSEQ,x dex bpl .2 diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 726b600e..978555d4 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -100,7 +100,7 @@ TCP.IN.JMP.LISTEN >PUSHW L.SKT.Template - jsr SKT.New.Listen Assign SEQNUM + jsr SKT.New.Listen Assign OUTNEXTSEQ bcs .99 sty .1+1 @@ -116,15 +116,15 @@ TCP.IN.JMP.LISTEN .2 lda #$ff sta ZPPtrSKT+1 - ldy #S.TCP.SEQ.NUMBER+3 Get Remote SEQ + ldy #S.TCP.SEQNUM+3 Get Remote SEQ ldx #3 sec -.3 lda (ZPFrameInPtr),y Set ACK=SEQ+1 for new socket... +.3 lda (ZPFrameInPtr),y Set OUTACK=SEQ+1 for new socket... adc #0 - sta SKT.TCBCache+S.TCB.ACKNUM,x - sta SKT.TCBCache+S.TCB.NEXTSEQ,x + sta SKT.TCBCache+S.TCB.INLASTSEQNUM,x + sta SKT.TCBCache+S.TCB.OUTACKNUM,x dey dex bpl .3 @@ -134,7 +134,7 @@ TCP.IN.JMP.LISTEN jsr ARP.AddFromFrameInPtr lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK - jsr TCP.OUT.SendOpt Send SYN.ACK + jsr TCP.OUT.SendOptA SYN recieved, Send SYN.ACK bcs .9 ldy #S.SOCKET.TCP.STATUS @@ -158,13 +158,13 @@ TCP.IN.JMP.SYNSENT jsr SKT.GetTCB ldx #3 - ldy #S.TCP.ACK.NUMBER+3 + ldy #S.TCP.ACKNUM+3 - sec Check if ACK=my SEQ+1 + sec Check if ACK=OUTNEXTSEQ+1 -.1 lda SKT.TCBCache+S.TCB.ACKNUM,x +.1 lda SKT.TCBCache+S.TCB.OUTNEXTSEQ,x adc #0 - sta SKT.TCBCache+S.TCB.ACKNUM,x + sta SKT.TCBCache+S.TCB.OUTNEXTSEQ,x eor (ZPFrameInPtr),y bne .8 dey @@ -172,7 +172,7 @@ TCP.IN.JMP.SYNSENT bpl .1 lda #S.TCP.OPTIONS.ACK - jsr TCP.OUT.SendOpt + jsr TCP.OUT.SendOptA SYN.ACK recieved, Send, ACK bcs .9 ldy #S.SOCKET.TCP.STATUS @@ -191,13 +191,14 @@ TCP.IN.JMP.SYNRCVD jsr SKT.GetTCB ldx #3 - ldy #S.TCP.ACK.NUMBER+3 + ldy #S.TCP.ACKNUM+3 sec -.1 lda SKT.TCBCache+S.TCB.SEQNUM,x Check if ACK=my SEQ+1 +.1 lda SKT.TCBCache+S.TCB.OUTNEXTSEQ,x Check if ACK=OUTNEXTSEQ+1 adc #0 - sta SKT.TCBCache+S.TCB.SEQNUM,x + sta SKT.TCBCache+S.TCB.OUTSEQNUM,x setup SEQNUM + sta SKT.TCBCache+S.TCB.OUTNEXTSEQ,x ...and update NEXTSEQ eor (ZPFrameInPtr),y bne .8 dey @@ -232,7 +233,10 @@ TCP.IN.JMP.ESTBLSH beq .2 No data, ... jsr SKT.AddDataToSktIn yes, queue data if there is room for.... - + bcs .2 + + jsr SKT.StoreTCB success, update socket + .2 ldy #S.TCP.OPTIONS lda (ZPFrameInPtr),y and #S.TCP.OPTIONS.FIN @@ -288,7 +292,7 @@ TCP.IN.JMP.FINWT1 ora #S.TCP.OPTIONS.ACK sta (ZPPtrSKT),y - jsr TCP.OUT + jsr TCP.OUT FINWT1, Ack the FIN bcs .9 ldy #S.SOCKET.TCP.STATUS @@ -309,7 +313,7 @@ TCP.IN.JMP.FINWT2 ora #S.TCP.OPTIONS.ACK sta (ZPPtrSKT),y - jsr TCP.OUT + jsr TCP.OUT ACK the FIN bcs .9 ldy #S.SOCKET.TCP.STATUS @@ -387,8 +391,8 @@ TCP.IN.SetDataInPtrAndLen *-------------------------------------- TCP.OUT jsr SKT.GetTCB -TCP.OUT.I lda SKT.TCBCache+S.TCB.TOSEND+1 - ldy SKT.TCBCache+S.TCB.TOSEND +TCP.OUT.I lda SKT.TCBCache+S.TCB.OUTTOSEND+1 + ldy SKT.TCBCache+S.TCB.OUTTOSEND bne .1 @@ -399,7 +403,7 @@ TCP.OUT.I lda SKT.TCBCache+S.TCB.TOSEND+1 ldy #S.SOCKET.TCP.OPTIONS lda (ZPPtrSKT),y - bne TCP.OUT.SendOpt a least an option... + bne TCP.OUT.SendOptA a least an option... clc No, data, no flag....exit rts @@ -409,7 +413,7 @@ TCP.OUT.I lda SKT.TCBCache+S.TCB.TOSEND+1 pla bcc .2 no....keep data len - >LDYAI K.TCP.MSS yes get only MSS + >LDYAI K.TCP.MSS yes send only MSS .2 jsr TCP.NewFrame bcs TCP.OUT.9 @@ -418,62 +422,63 @@ TCP.OUT.I lda SKT.TCBCache+S.TCB.TOSEND+1 ldy #S.SOCKET.TCP.OPTIONS lda (ZPPtrSKT),y - jsr TCP.OUT.Send + jsr TCP.OUT.SendOptA.1 bcs TCP.OUT.9 - lda SKT.TCBCache+S.TCB.SEQNUM+3 + lda SKT.TCBCache+S.TCB.OUTNEXTSEQ+3 clc adc ZPDataOutLen - sta SKT.TCBCache+S.TCB.SEQNUM+3 + sta SKT.TCBCache+S.TCB.OUTNEXTSEQ+3 - lda SKT.TCBCache+S.TCB.SEQNUM+2 + lda SKT.TCBCache+S.TCB.OUTNEXTSEQ+2 adc ZPDataOutLen+1 - sta SKT.TCBCache+S.TCB.SEQNUM+2 + sta SKT.TCBCache+S.TCB.OUTNEXTSEQ+2 bcc .80 - inc SKT.TCBCache+S.TCB.SEQNUM+1 + inc SKT.TCBCache+S.TCB.OUTNEXTSEQ+1 bne .80 - inc SKT.TCBCache+S.TCB.SEQNUM + inc SKT.TCBCache+S.TCB.OUTNEXTSEQ .80 jmp SKT.StoreTCB TCP.OUT.9 rts *-------------------------------------- -TCP.OUT.SendOpt sta .1+1 +TCP.OUT.SendOptA + sta .1+1 >LDYAI 0 jsr TCP.NewFrame bcs TCP.OUT.9 .1 lda #$ff -TCP.OUT.Send ldy #S.TCP.OPTIONS +TCP.OUT.SendOptA.1 + ldy #S.TCP.OPTIONS sta (ZPFrameOutPtr),y and #S.TCP.OPTIONS.ACK - beq .11 ldx #3 - ldy #S.TCP.ACK.NUMBER+3 + ldy #S.TCP.ACKNUM+3 -.10 lda SKT.TCBCache+S.TCB.ACKNUM,x +.10 lda SKT.TCBCache+S.TCB.OUTACKNUM,x sta (ZPFrameOutPtr),y dey dex bpl .10 bra .1 -.11 ldy #S.TCP.ACK.NUMBER +.11 ldy #S.TCP.ACKNUM lda #0 .12 sta (ZPFrameOutPtr),y iny - cpy #S.TCP.ACK.NUMBER+4 + cpy #S.TCP.ACKNUM+4 bne .12 .1 ldx #3 - ldy #S.TCP.SEQ.NUMBER+3 + ldy #S.TCP.SEQNUM+3 -.2 lda SKT.TCBCache+S.TCB.SEQNUM,x +.2 lda SKT.TCBCache+S.TCB.OUTNEXTSEQ,x sta (ZPFrameOutPtr),y dey dex diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index c30de0dc..bfa94260 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -110,8 +110,9 @@ L.TCP.IN.JMP .DA TCP.IN.JMP.CLOSED .DA TCP.IN.JMP.TIMEWT .DA 0 *-------------------------------------- -LIB.LOAD lda bFirstLoad +LIB.LOAD ldx bFirstLoad bne .8 + sta NODE.SSOCK+S.NODE.HANDLER jsr ARP.CLEAR jsr DNS.CLEAR @@ -299,6 +300,14 @@ HST.DecStr .BS 4 HST.IP .BS 5 IP.ID .BS 2 IP.CHECKSUM .BS 4 +NODE.SSOCK .BS 1 S.NODE.HANDLER + .DA #S.NODE.T.SSOCK + .BS 1 S.NODE.SSOCK.HSKT + .DA #0 S.NODE.SSOCK.OPEN + .DA #0 S.NODE.SSOCK.CLOSE + .DA LIBTCPIP.SKT.GetCA + .DA LIBTCPIP.SKT.PutC + .DA #0 S.NODE.SSOCK.STATUS *-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBTCPIP.S diff --git a/SYS/KERNEL.S.D01.txt b/SYS/KERNEL.S.D01.txt index f832e468..18b2d642 100644 --- a/SYS/KERNEL.S.D01.txt +++ b/SYS/KERNEL.S.D01.txt @@ -58,7 +58,7 @@ A2osX.PrtDrv.GetParam *-------------------------------------- A2osX.PrtDrv.GetDev txa - asl + lsr sta A2osX.PrtDrv.Go.Cmd tax lda A2osX.PrtDrv.Cnt,x diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 8afe4375..07868668 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -154,7 +154,8 @@ K.MkNodYA jsr K.GetDevByNameYA Ptr1=NAME * A=hSocket * ## OUT: * CC = OK, CS = ERROR -* A = hFILE +* X = hFILE +* Y,A = pFILE *\-------------------------------------- K.MkNodA sta .1+1 >PUSHWI S.NODE.SSOCK @@ -172,7 +173,7 @@ K.MkNodA sta .1+1 .1 lda #$ff sta (ZPPtr1),y - txa + >LDYA ZPPtr1 .9 rts */-------------------------------------- * # MKFIFO diff --git a/SYS/KERNEL.S.INIT3.txt b/SYS/KERNEL.S.INIT3.txt index 9dc30cc8..0c536b1a 100644 --- a/SYS/KERNEL.S.INIT3.txt +++ b/SYS/KERNEL.S.INIT3.txt @@ -274,7 +274,7 @@ DevMgrInit stz ZPPtr1 bra .7 .3 inc - beq .7 $ff, Disk II 13 Sect, ingnore + beq .7 $ff, Disk II 13 Sect, ignore ldy #7 lda (ZPPtr1),y @@ -337,6 +337,9 @@ DevMgrInit.SP ldy #$ff sta .1+2 sta .3+2 sta DEV.HEADER+S.DEV.ROM.JMP+1 + + >LDYAI A2osX.PrtDrv + >STYA DEV.HEADER+S.DEV.DRV.JMP .1 jsr $ffff Self Modified .DA #0 Status @@ -345,8 +348,7 @@ DevMgrInit.SP ldy #$ff lda SP.CTRL.STATUS.DATA beq .9 no device -.2 lda #'1' - sta DEV.HEADER+S.DEV.DEVID +.2 lda #1 sta SP.DEV.STATUS.DEVID .3 jsr $ffff Self Modified @@ -358,7 +360,8 @@ DevMgrInit.SP ldy #$ff jsr DevMgrInit.AddDev -.7 inc DEV.HEADER+S.DEV.DEVID +.7 inc SP.DEV.STATUS.DEVID + inc DEV.HEADER+S.DEV.DEVID dec SP.CTRL.STATUS.DATA bne .3 diff --git a/SYS/KERNEL.S.LIB.txt b/SYS/KERNEL.S.LIB.txt index 2ebd6d78..1101d4e2 100644 --- a/SYS/KERNEL.S.LIB.txt +++ b/SYS/KERNEL.S.LIB.txt @@ -1,6 +1,6 @@ PR#3 PREFIX /A2OSX.BUILD -NEW +LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- @@ -10,7 +10,7 @@ AUTO 6 * out : * A = hMem To loaded LIB *-------------------------------------- -K.LoadLibYA >STYA K.LoadLib.Name SAVE /A2OSX.SRC/LIBname for K.FileSearch +K.LoadLibYA >STYA K.LoadLib.Name SAVE LIBname for K.FileSearch >LDYAI ENV.LIB push ENVNAME=LIB >SYSCALL GetEnvYA get value for ENV=LIB bcs .99 @@ -30,6 +30,7 @@ K.LoadLibYA >STYA K.LoadLib.Name SAVE /A2OSX.SRC/LIBname for K.FileSearch stx K.LoadLib.hMem >STYA LIB.Jump+1 + txa Pass hLib to LibLoad ldx #LIBMGR.LOAD jsr LIB.Jump Call LIB.LOAD function diff --git a/_Docs/KERNEL.md b/_Docs/KERNEL.md index 4c81f700..2ea38f17 100644 --- a/_Docs/KERNEL.md +++ b/_Docs/KERNEL.md @@ -195,7 +195,8 @@ return a hFile for a given Socket ## OUT: + CC = OK, CS = ERROR -+ A = hFILE ++ X = hFILE ++ Y,A = pFILE # MKFIFO return a S.FILE to a new FIFO @@ -455,26 +456,26 @@ And return, if found, the full path to it. # ChTyp ## In: -+ PUSHB = TYPE ... -+ PUSHW = PATH ...FOpen) ++ PUSHB = TYPE ++ PUSHW = PATH # ChMod ## In: -+ PUSHW = MODE ... -+ PUSHW = PATH ...FOpen) ++ PUSHW = MODE ++ PUSHW = PATH # ChOwn ## In: -+ PUSHW = UID ... -+ PUSHW = PATH ...FOpen) ++ PUSHW = UID ++ PUSHW = PATH # ChGrp ## In: -+ PUSHW = GID ... -+ PUSHW = PATH ...FOpen) ++ PUSHW = GID ++ PUSHW = PATH # GetMem