From 04510ec5bf3e38c61823ec9bc0e9db4d7920259d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 9 Nov 2018 14:29:23 +0100 Subject: [PATCH] Kernel 0.9.2 --- .Docs/LIBTCPIP.md | 29 ++++++- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/ARP.S.txt | 54 ++++++++---- BIN/IPCONFIG.S.txt | 2 +- INC/LIBTCPIP.I.txt | 8 +- LIB/LIBTCPIP.S.ARP.txt | 10 ++- LIB/LIBTCPIP.S.SKT.txt | 180 +++++++++++++-------------------------- LIB/LIBTCPIP.S.UDP.txt | 90 -------------------- LIB/LIBTCPIP.S.txt | 118 +++++++++++++++++++++++++ SBIN/SHELL.S.CMD.txt | 6 +- 11 files changed, 255 insertions(+), 242 deletions(-) diff --git a/.Docs/LIBTCPIP.md b/.Docs/LIBTCPIP.md index d037976c..a45e0936 100644 --- a/.Docs/LIBTCPIP.md +++ b/.Docs/LIBTCPIP.md @@ -217,6 +217,33 @@ CS: A = EC CC: Y,A = bytes written CS: A = EC +# GetSockOpt +Set Socket Options + +## C +`int getsockopt(hFD fd);` + +## ASM +**In:** +`lda fd` +`>LIBCALL hLIBTCPIP,LIBTCPIP.GetSockOpt` + +## RETURN VALUE + +# SetSockOpt +Set Socket Options + +## C +`int setsockopt(hFD fd, short int opts);` + +## ASM +**In:** +`>PUSHWI opts` +`lda fd` +`>LIBCALL hLIBTCPIP,LIBTCPIP.SetSockOpt` + +## RETURN VALUE + # GetTable Get socket table @@ -225,6 +252,6 @@ Get socket table ## ASM **In:** -`>LIBCALL hLIBTCPIP,LIBTCPIP.skt.GetTable` +`>LIBCALL hLIBTCPIP,LIBTCPIP.GetTable` ## RETURN VALUE diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index d2d813601ab27af0ccd8ac1235dd0d507e895d7b..bb6438eaa881563e409c33614859e7b6a66f0393 100644 GIT binary patch delta 7236 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 delta 8014 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 diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index dcd6962bed7156ef4f589f9c646e578af95c3a08..4fd1520dae462aaed4cba82cd800646d75d5d1ef 100644 GIT binary patch delta 24199 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 w3f%4uE;orv;|%y9*~P$x0=Ief{l0 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 diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt index 7b154eff..ffa8fe39 100644 --- a/BIN/ARP.S.txt +++ b/BIN/ARP.S.txt @@ -38,6 +38,7 @@ CS.START cld L.LIBTCPIP .DA LIBTCPIP L.SSCANF.IP .DA SSCANF.IP L.SSCANF.MAC .DA SSCANF.MAC +L.MSG.Usage .DA MSG.Usage L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 L.MSG2 .DA MSG2 @@ -50,32 +51,48 @@ CS.INIT >LDYA L.LIBTCPIP .9 rts *-------------------------------------- -CS.RUN ldy #S.PS.ARGC +CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG + >STYA ZPPTR1 + + ldy #S.IPCFG.STATUS + lda (ZPPTR1),y + bmi .1 + + jmp CS.RUN.ERR + +.1 ldy #S.PS.ARGC lda (pPs),y cmp #2 - bcs .1 + bcs .2 jmp CS.RUN.DUMP -.1 >PUSHEA.G DST.IP+3 +.2 >PUSHEA.G DST.IP+3 >PUSHEA.G DST.IP+2 >PUSHEA.G DST.IP+1 >PUSHEA.G DST.IP + + >PUSHBI 8 4 Ptrs + >PUSHW L.SSCANF.IP lda #1 >SYSCALL ArgV - >SYSCALL sscanf - bcs .9 + bcs CS.RUN.ERR ldy #S.PS.ARGC lda (pPs),y - cmp #1 + cmp #2 beq CS.RUN.QUERY - cmp #2 - beq CS.RUN.ADD + cmp #3 + bne CS.RUN.ERR + jmp CS.RUN.ADD -.9 lda #E.SYN +CS.RUN.ERR >PUSHBI 0 + >LDYA L.MSG.Usage + >SYSCALL printf + + lda #E.SYN sec rts *-------------------------------------- @@ -87,13 +104,13 @@ CS.RUN.QUERY jsr Init.Timeout bcc .2 success, print & exit jsr Wait.TimeOut - bcs .9 + bcs .8 >SLEEP >SYSCALL GetChar bcs .1 cmp #3 - beq .8 + beq .9 bra .1 .2 ldy #5 @@ -123,6 +140,9 @@ CS.RUN.ADD >PUSHEA.G DST.MAC+5 >PUSHEA.G DST.MAC+2 >PUSHEA.G DST.MAC+1 >PUSHEA.G DST.MAC + + >PUSHBI 12 6 Ptrs + >PUSHW L.SSCANF.MAC lda #2 >SYSCALL ArgV @@ -133,13 +153,10 @@ CS.RUN.ADD >PUSHEA.G DST.MAC+5 >PUSHEA.G DST.MAC >PUSHEA.G DST.IP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD - bcc CS.RUN.DUMP + clc +.8 rts - rts - -.9 lda #E.SYN -.99 sec - rts +.9 jmp CS.RUN.ERR *-------------------------------------- CS.RUN.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE >STYA ZPPTR1 @@ -222,6 +239,9 @@ CS.END LIBTCPIP .AZ "libtcpip" SSCANF.IP .AZ "%d.%d.%d.%d" SSCANF.MAC .AZ "%h:%h:%h:%h:%h:%h" +MSG.Usage .AS "Usage : ARP, display ARP cache\r\n" + .AS " ARP ip.ip.ip.ip query cache or network\r\n" + .AZ " ARP ip.ip.ip.ip HH:HH:HH:HH:HH:HH add a static ARP record in Cache\r\n" MSG0 .AZ "STS TTL MAC Address IP Address" MSG1 .AZ "$%h %5D %h:%h:%h:%h:%h:%h %d.%d.%d.%d\r\n" MSG2 .AZ "%d.%d.%d.%d is at %h:%h:%h:%h:%h:%h\r\n" diff --git a/BIN/IPCONFIG.S.txt b/BIN/IPCONFIG.S.txt index 2988925b..4ab9e3bc 100644 --- a/BIN/IPCONFIG.S.txt +++ b/BIN/IPCONFIG.S.txt @@ -61,7 +61,7 @@ CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib bcs .9 sta hLIBTCPIP - clc + .9 rts *-------------------------------------- CS.RUN >PUSHBI 0 diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index bf5f1822..6fb620ab 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -92,10 +92,10 @@ S.IPCFG.DOMAIN .EQ 48 79+\0 C String * S.IPCFG .EQ 128 *-------------------------------------- -S.ARPCACHE.STATUS .EQ 0 -S.ARPCACHE.STATUS.PENDING .EQ 1 -S.ARPCACHE.STATUS.STATIC .EQ 2 -S.ARPCACHE.STATUS.RESOLVED .EQ 128 +S.ARPCACHE.S .EQ 0 +S.ARPCACHE.S.PENDING .EQ 1 +S.ARPCACHE.S.STATIC .EQ 2 +S.ARPCACHE.S.RESOLVED .EQ 128 S.ARPCACHE.TTL .EQ 2 S.ARPCACHE.IP .EQ 6 S.ARPCACHE.MAC .EQ 10 diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index 2ffe6649..d043c355 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -69,7 +69,7 @@ ARP.Add >PULLW ZPPtrIP IP dey bpl .2 - lda #S.ARPCACHE.STATUS.RESOLVED+S.ARPCACHE.STATUS.STATIC + lda #S.ARPCACHE.S.RESOLVED+S.ARPCACHE.S.STATIC ARP.ADD.I sta ARP.TmpCache @@ -123,7 +123,7 @@ ARP.AddFromFrameInPtr lda /K.ARP.TTL sta ARP.TmpCache+S.ARPCACHE.TTL+1 - lda #S.ARPCACHE.STATUS.RESOLVED + lda #S.ARPCACHE.S.RESOLVED jmp ARP.ADD.I *-------------------------------------- ARP.IN ldy #S.ARP.TPA+3 @@ -200,7 +200,7 @@ ARP.IN.REP lda #K.ARP.TTL dex bpl .2 - lda #S.ARPCACHE.STATUS.RESOLVED + lda #S.ARPCACHE.S.RESOLVED jsr ARP.ADD.I jmp ARP.IN.EXIT @@ -246,7 +246,7 @@ ARP.QUERY.I jsr ARP.FIND.BY.IP sta ARP.TmpCache+S.ARPCACHE.TTL stz ARP.TmpCache+S.ARPCACHE.TTL+1 - lda #S.ARPCACHE.STATUS.PENDING + lda #S.ARPCACHE.S.PENDING jsr ARP.ADD.I .9 lda #ERR.ARP.PENDING @@ -343,6 +343,8 @@ ARP.EXPIRE >LDYA L.ARP.CACHE .1 lda (ZPCachePtr) beq .2 + and #S.ARPCACHE.S.STATIC + bne .2 ldy #S.ARPCACHE.TTL sec diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index df187c58..db118d26 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -123,14 +123,39 @@ SKT.bind >SYSCALL GetMemPtr sta SKT.LOC.ADDR+S.SOCKADDR.PORT stx SKT.LOC.ADDR+S.SOCKADDR.PORT+1 -.1 jsr SKT.FindMatchingLoc - bcc .9 +.1 ldx #0 + +.2 lda SKT.TABLE,x + beq .7 + + phx + >SYSCALL GetMemPtr + >STYA ZPTmpPtr1 + plx + + ldy #S.SOCKET.AF + lda (ZPTmpPtr1),y + cmp #AF.INET + bne .7 + + ldy #S.SOCKET.LOC.ADDR + +.3 lda (ZPTmpPtr1),y + cmp SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y + bne .7 + iny + cpy #S.SOCKET.LOC.PORT+2 + bne .3 + + lda #ERR.SKT.BUSY +* sec + rts + +.7 inx + cpx #K.SKTTABLE.SIZE + bne .2 jmp SKT.SetLocAddr - -.9 lda #ERR.SKT.BUSY - sec - rts */-------------------------------------- * # Connect * Initiate a connection on a socket @@ -359,10 +384,7 @@ SKT.shutdown.STREAM * CC: Y,A = bytes read * CS: A = EC *\-------------------------------------- -SKT.Read >SYSCALL GetMemPtr - >STYA ZPPtrSKT - >PULLW ZPDataInPtr !!!DataOut trashed when sending ACK in TCP.OUT - >PULLW ZPDataInLen !!!use DataInPtr/Len +SKT.Read jsr SKT.PullhFDDataInPtrLen ldy #S.SOCKET.T lda (ZPPtrSKT),y @@ -409,10 +431,7 @@ SKT.Read >SYSCALL GetMemPtr * CC: Y,A = bytes written * CS: A = EC *\-------------------------------------- -SKT.Write >SYSCALL GetMemPtr - >STYA ZPPtrSKT - >PULLW ZPDataInPtr - >PULLW ZPDataInLen +SKT.Write jsr SKT.PullhFDDataInPtrLen ldy #S.SOCKET.T lda (ZPPtrSKT),y @@ -575,11 +594,8 @@ SKT.SendTo sec .HS 90 BCC SKT.Send clc php - >SYSCALL GetMemPtr - >STYA ZPPtrSKT + jsr SKT.PullhFDDataInPtrLen plp - >PULLW ZPDataInPtr - >PULLW ZPDataInLen bcc .1 jsr SKT.PullRemAddr jsr SKT.SetRemAddr @@ -663,6 +679,13 @@ SKT.GetTable >LDYA L.SKT.Table clc rts *-------------------------------------- +SKT.PullhFDDataInPtrLen + >SYSCALL GetMemPtr + >STYA ZPPtrSKT + >PULLW ZPDataInPtr !!!DataOut trashed when sending ACK in TCP.OUT + >PULLW ZPDataInLen !!!use DataInPtr/Len + rts +*-------------------------------------- SKT.PullLocAddr >PULLW ZPTmpPtr1 ldy #S.SOCKADDR-1 .1 lda (ZPTmpPtr1),y @@ -696,7 +719,9 @@ SKT.SetRemAddr ldy #S.SOCKET.REM.PORT+1 rts *-------------------------------------- SKT.FindMatchingLocRem + .DO IPDEBUG=1 jsr FRM.Dump + .FIN ldx #0 .1 lda SKT.TABLE,x @@ -705,7 +730,9 @@ SKT.FindMatchingLocRem phx >SYSCALL GetMemPtr >STYA ZPPtrSKT + .DO IPDEBUG=1 jsr SKT.Dump + .FIN plx ldy #S.SOCKET.AF @@ -748,22 +775,20 @@ SKT.FindMatchingLocRem and #S.SOCKET.O.BROADCAST beq .9 this socket does not accept broadcast - ldy #S.SOCKET.REM.PORT Boradcast, check port only - bra .5 + bra .43 .41 ldy #S.SOCKET.REM.ADDR .5 lda (ZPPtrSKT),y cmp #$ff accept 255.255.255.255 ? - bne .43 + bne .42 - ldy #S.SOCKET.REM.PORT Boradcast, check port only - bra .43 +.43 ldy #S.SOCKET.REM.PORT Boradcast, check port only .42 lda (ZPPtrSKT),y -.43 cmp SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y + cmp SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y bne .8 wrong remote host, exit.... iny cpy #S.SOCKET.REM.PORT+2 @@ -780,42 +805,6 @@ SKT.FindMatchingLocRem .9 sec rts *-------------------------------------- -SKT.FindMatchingLoc - ldx #0 - -.1 lda SKT.TABLE,x - beq .7 - - phx - >SYSCALL GetMemPtr - >STYA ZPTmpPtr1 - plx - - 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 - iny - cpy #S.SOCKET.LOC.PORT+2 - bne .2 - - >LDYA ZPTmpPtr1 x = SKT.TABLE index - clc - rts - -.7 inx - cpx #K.SKTTABLE.SIZE - bne .1 - -* sec -.9 rts -*-------------------------------------- SKT.AddToQueueA pha ldy #S.SOCKET.HQ.HEAD lda (ZPPtrSKT),y @@ -925,23 +914,8 @@ SKT.AddDataToSktIn .9 sec rts -.8 lda SKT.Cache+S.SOCKET.TCP.INFREE - sec - sbc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.INFREE - - lda SKT.Cache+S.SOCKET.TCP.INFREE+1 - sbc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.INFREE+1 - - lda SKT.Cache+S.SOCKET.TCP.INUSED - clc - adc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.INUSED - - lda SKT.Cache+S.SOCKET.TCP.INUSED+1 - adc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.INUSED+1 +.8 >SBC16 SKT.Cache+S.SOCKET.TCP.INFREE,ZPDataInLen + >ADC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPDataInLen clc @@ -1058,21 +1032,8 @@ SKT.GetDataFromSktIn ora ZPTmpPtr3+1 beq .9 - lda SKT.Cache+S.SOCKET.TCP.INFREE - clc - adc ZPTmpPtr3 - sta SKT.Cache+S.SOCKET.TCP.INFREE - lda SKT.Cache+S.SOCKET.TCP.INFREE+1 - adc ZPTmpPtr3+1 - sta SKT.Cache+S.SOCKET.TCP.INFREE+1 - - lda SKT.Cache+S.SOCKET.TCP.INUSED - sec - sbc ZPTmpPtr3 - sta SKT.Cache+S.SOCKET.TCP.INUSED - lda SKT.Cache+S.SOCKET.TCP.INUSED+1 - sbc ZPTmpPtr3+1 - sta SKT.Cache+S.SOCKET.TCP.INUSED+1 + >ADC16 SKT.Cache+S.SOCKET.TCP.INFREE,ZPTmpPtr3 + >SBC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPTmpPtr3 lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3 clc @@ -1175,29 +1136,9 @@ SKT.AddDataToSktOut .9 sec rts -.8 lda SKT.Cache+S.SOCKET.TCP.OUTFREE - sec - sbc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.OUTFREE - lda SKT.Cache+S.SOCKET.TCP.OUTFREE+1 - sbc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.OUTFREE+1 - - lda SKT.Cache+S.SOCKET.TCP.OUTUSED - clc - adc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.OUTUSED - lda SKT.Cache+S.SOCKET.TCP.OUTUSED+1 - adc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.OUTUSED+1 - - lda SKT.Cache+S.SOCKET.TCP.OUTTOSEND - clc - adc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.OUTTOSEND - lda SKT.Cache+S.SOCKET.TCP.OUTTOSEND+1 - adc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.OUTTOSEND+1 +.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTFREE,ZPDataInLen + >ADC16 SKT.Cache+S.SOCKET.TCP.OUTUSED,ZPDataInLen + >ADC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataInLen jmp SKT.StoreTCB *-------------------------------------- * From TCP.OUT @@ -1262,13 +1203,7 @@ SKT.GetDataFromSktOut sta ZPTmpPtr2+1 bra .1 -.8 lda SKT.Cache+S.SOCKET.TCP.OUTTOSEND - sec - sbc ZPDataOutLen - sta SKT.Cache+S.SOCKET.TCP.OUTTOSEND - lda SKT.Cache+S.SOCKET.TCP.OUTTOSEND+1 - sbc ZPDataOutLen+1 - sta SKT.Cache+S.SOCKET.TCP.OUTTOSEND+1 +.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataOutLen clc rts @@ -1307,6 +1242,7 @@ SKT.AckDataToSktOut adc SKT.Cache+S.SOCKET.TCP.OUTTAIL+1 and /K.TCP.WSIZE-1 sta SKT.Cache+S.SOCKET.TCP.OUTTAIL+1 + lda SKT.Cache+S.SOCKET.TCP.OUTFREE clc adc TmpDWord+3 diff --git a/LIB/LIBTCPIP.S.UDP.txt b/LIB/LIBTCPIP.S.UDP.txt index f0cf9f46..39f65278 100644 --- a/LIB/LIBTCPIP.S.UDP.txt +++ b/LIB/LIBTCPIP.S.UDP.txt @@ -21,96 +21,6 @@ UDP.IN jsr FRM.GetTargetSKT.TCPUDP >SYSCALL FreeMem .8 rts *-------------------------------------- -FRM.Dump ldy #S.TCPUDP.DSTPORT - lda (ZPFrameInPtr),y - >PUSHA - iny - lda (ZPFrameInPtr),y - >PUSHA - - ldy #S.IP.DST+3 - lda (ZPFrameInPtr),y - >PUSHA - dey - lda (ZPFrameInPtr),y - >PUSHA - dey - lda (ZPFrameInPtr),y - >PUSHA - dey - lda (ZPFrameInPtr),y - >PUSHA - - ldy #S.TCPUDP.SRCPORT - lda (ZPFrameInPtr),y - >PUSHA - iny - lda (ZPFrameInPtr),y - >PUSHA - - ldy #S.IP.SRC+3 - lda (ZPFrameInPtr),y - >PUSHA - dey - lda (ZPFrameInPtr),y - >PUSHA - dey - lda (ZPFrameInPtr),y - >PUSHA - dey - lda (ZPFrameInPtr),y - >PUSHA - - >PUSHBI 12 - >LDYA L.MSG.FRM.Dump - >SYSCALL Printf - rts -*-------------------------------------- -SKT.Dump ldy #S.SOCKET.REM.PORT+1 - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - - ldy #S.SOCKET.REM.ADDR+3 - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - - ldy #S.SOCKET.LOC.PORT+1 - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - - ldy #S.SOCKET.LOC.ADDR+3 - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - dey - lda (ZPPtrSKT),y - >PUSHA - - >PUSHBI 12 - >LDYA L.MSG.SKT.Dump - >SYSCALL Printf - rts -*-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBTCPIP.S.UDP LOAD /A2OSX.SRC/LIB/LIBTCPIP.S diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 51ea6633..35eeb47a 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -5,6 +5,28 @@ AUTO 4,1 .OP 65C02 .OR $2000 .TF LIB/LIBTCPIP +*-------------------------------------- +IPDEBUG .EQ 0 +*-------------------------------------- + .MA ADC16 + clc + lda ]1 + adc ]2 + sta ]1 + lda ]1+1 + adc ]2+1 + sta ]1+1 + .EM +*-------------------------------------- + .MA SBC16 + sec + lda ]1 + sbc ]2 + sta ]1 + lda ]1+1 + sbc ]2+1 + sta ]1+1 + .EM *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I @@ -150,8 +172,10 @@ J.SKT.send .DA SKT.send.RAW .DA SKT.send.DGRAM .DA SKT.send.SEQPACKET .DA SKT.send.STREAM + .DO IPDEBUG=1 L.MSG.FRM.Dump .DA MSG.FRM.Dump L.MSG.SKT.Dump .DA MSG.SKT.Dump + .FIN .DA 0 *-------------------------------------- LIB.LOAD ldx RefCount @@ -258,6 +282,98 @@ GetDynPort inc DYNPORT.LAST ldx DYNPORT.LAST+1 clc rts +*-------------------------------------- + .DO IPDEBUG=1 +FRM.Dump ldy #S.TCPUDP.DSTPORT + lda (ZPFrameInPtr),y + >PUSHA + iny + lda (ZPFrameInPtr),y + >PUSHA + + ldy #S.IP.DST+3 + lda (ZPFrameInPtr),y + >PUSHA + dey + lda (ZPFrameInPtr),y + >PUSHA + dey + lda (ZPFrameInPtr),y + >PUSHA + dey + lda (ZPFrameInPtr),y + >PUSHA + + ldy #S.TCPUDP.SRCPORT + lda (ZPFrameInPtr),y + >PUSHA + iny + lda (ZPFrameInPtr),y + >PUSHA + + ldy #S.IP.SRC+3 + lda (ZPFrameInPtr),y + >PUSHA + dey + lda (ZPFrameInPtr),y + >PUSHA + dey + lda (ZPFrameInPtr),y + >PUSHA + dey + lda (ZPFrameInPtr),y + >PUSHA + + >PUSHBI 12 + >LDYA L.MSG.FRM.Dump + >SYSCALL Printf + rts +*-------------------------------------- +SKT.Dump ldy #S.SOCKET.REM.PORT+1 + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + + ldy #S.SOCKET.REM.ADDR+3 + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + + ldy #S.SOCKET.LOC.PORT+1 + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + + ldy #S.SOCKET.LOC.ADDR+3 + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + dey + lda (ZPPtrSKT),y + >PUSHA + + >PUSHBI 12 + >LDYA L.MSG.SKT.Dump + >SYSCALL Printf + rts + .FIN *-------------------------------------- .INB /A2OSX.SRC/LIB/LIBTCPIP.S.ARP .INB /A2OSX.SRC/LIB/LIBTCPIP.S.CFG @@ -404,8 +520,10 @@ hFrameOut .BS 1 HST.SScanF .AZ "%d.%d.%d.%d" IP.ID .BS 2 IP.CHECKSUM .BS 2 + .DO IPDEBUG=1 MSG.FRM.Dump .AZ "FRM:SRC=%d.%d.%d.%d:%D DST=%d.%d.%d.%d:%D\r\n" MSG.SKT.Dump .AZ "SKT:LOC=%d.%d.%d.%d:%D REM=%d.%d.%d.%d:%D\r\n" + .FIN *-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBTCPIP.S diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index dcf28886..89a90df7 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -585,10 +585,10 @@ Cmd.INT.READ ldx #1 clc .99 rts *-------------------------------------- -Cmd.INT.SLEEP lda (ZPCMDBuf) - beq .9 +Cmd.INT.SLEEP ldx #1 + jsr Cmd.GetArgX + bcs .9 - >LDYA ZPCMDBuf >SYSCALL AToL bcs .9