diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index 86e27842..fbdc75e5 100644 Binary files a/A2OSX.BOOT.po and b/A2OSX.BOOT.po differ diff --git a/A2OSX.DEV.po b/A2OSX.DEV.po index 8f16acd4..f2f2b8ec 100644 Binary files a/A2OSX.DEV.po and b/A2OSX.DEV.po differ diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index e7547073..ea0d47db 100644 Binary files a/A2OSX.SRC.po and b/A2OSX.SRC.po differ diff --git a/BIN/NETSTAT.S.txt b/BIN/NETSTAT.S.txt index 42a01d64..c092cd3a 100644 --- a/BIN/NETSTAT.S.txt +++ b/BIN/NETSTAT.S.txt @@ -72,9 +72,8 @@ CS.RUN >LDYA L.MSG0 .1 lda (ZPPTR1) beq .7 - ldy #S.SOCKET.STATUS + ldy #S.SOCKET.TCP.STATUS lda (ZPPTR1),y - and #S.SOCKET.STATUS.MASK asl tax >PUSHB L.MSG1.S+1,x @@ -90,10 +89,6 @@ CS.RUN >LDYA L.MSG0 bne .2 lda (ZPPTR1) - lsr - lsr - lsr - lsr cmp #S.SOCKET.SOCK.RAW+1 bcc .3 diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index 84abd4db..358a264f 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -177,7 +177,7 @@ CS.RUN.SEND.ECHO >PUSHW L.ICMP.Request >PUSHWI ICMP.RequestLen - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcs CS.RUN.ERR jsr Init.Timeout @@ -191,7 +191,7 @@ CS.RUN.WAIT.REPLY .1 ldy #hSocket lda (pData),y - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ReadA bcs .2 ldy #hFrame diff --git a/BIN/RPCDUMP.S.txt b/BIN/RPCDUMP.S.txt index 603ff6bc..b3b71d40 100644 --- a/BIN/RPCDUMP.S.txt +++ b/BIN/RPCDUMP.S.txt @@ -112,7 +112,7 @@ CS.RUN jsr Init.Timeout >PUSHW L.RPC.Request ldy #hSocket >PUSHB (pData),y - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcc .4 >SYSCALL Sleep @@ -124,7 +124,7 @@ CS.RUN jsr Init.Timeout .5 ldy #hSocket lda (pData),y - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ReadA bcc .6 >SYSCALL Sleep diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 2b83c030..b2a41015 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -26,46 +26,36 @@ K.TCP.WMASK .EQ 2047 LIBTCPIP.SET.IPCFG .EQ 4 LIBTCPIP.GET.IPCFG .EQ 6 -*LIBTCPIP.NEW.ICMP.FRAME .EQ 8 -*LIBTCPIP.NEW.TCP.FRAME .EQ 10 -*LIBTCPIP.NEW.UDP.FRAME .EQ 12 -*LIBTCPIP.NEW.IP.FRAME .EQ 14 -*LIBTCPIP.NEW.ARP.FRAME .EQ 16 -*LIBTCPIP.NEW.ETH.FRAME .EQ 18 +LIBTCPIP.POLL .EQ 8 +LIBTCPIP.PULSEA .EQ 10 -*LIBTCPIP.SEND.ICMP.FRAME .EQ 20 -*LIBTCPIP.SEND.TCP.FRAME .EQ 22 -*LIBTCPIP.SEND.UDP.FRAME .EQ 24 -*LIBTCPIP.SEND.IP.FRAME .EQ 26 -*LIBTCPIP.SEND.ARP.FRAME .EQ 28 -*LIBTCPIP.SEND.ETH.FRAME .EQ 30 +LIBTCPIP.ARP.CLEAR .EQ 12 +LIBTCPIP.ARP.QUERY .EQ 14 +LIBTCPIP.ARP.ADD .EQ 16 +LIBTCPIP.ARP.GETCACHE .EQ 18 -LIBTCPIP.ARP.CLEAR .EQ 32 -LIBTCPIP.ARP.QUERY .EQ 34 -LIBTCPIP.ARP.ADD .EQ 36 -LIBTCPIP.ARP.GETCACHE .EQ 38 +LIBTCPIP.DNS.CLEAR .EQ 20 +LIBTCPIP.DNS.QUERY .EQ 22 +LIBTCPIP.DNS.ADD .EQ 24 +LIBTCPIP.DNS.GETCACHE .EQ 26 -LIBTCPIP.DNS.CLEAR .EQ 40 -LIBTCPIP.DNS.QUERY .EQ 42 -LIBTCPIP.DNS.ADD .EQ 44 -LIBTCPIP.DNS.GETCACHE .EQ 46 +LIBTCPIP.HST.GETBYNAME .EQ 28 +LIBTCPIP.HST.GETBYADDR .EQ 30 -LIBTCPIP.POLL .EQ 48 -LIBTCPIP.PULSEA .EQ 50 +LIBTCPIP.SKT.NEW .EQ 32 +LIBTCPIP.SKT.CLOSEA .EQ 34 +LIBTCPIP.SKT.GETTABLE .EQ 36 +LIBTCPIP.SKT.GETA .EQ 38 -LIBTCPIP.SKT.NEW .EQ 52 -*LIBTCPIP.SKT.LISTEN .EQ 54 -LIBTCPIP.SKT.ACCEPTA .EQ 56 -LIBTCPIP.SKT.SENDA .EQ 58 -LIBTCPIP.SKT.SEND .EQ 60 -LIBTCPIP.SKT.RCVDA .EQ 62 -*LIBTCPIP.SKT.RCVD .EQ 64 -LIBTCPIP.SKT.CLOSEA .EQ 66 -LIBTCPIP.SKT.GETTABLE .EQ 68 -LIBTCPIP.SKT.GETA .EQ 70 +LIBTCPIP.SKT.ACCEPTA .EQ 34 -LIBTCPIP.HST.GETBYNAME .EQ 72 -LIBTCPIP.HST.GETBYADDR .EQ 74 +LIBTCPIP.SKT.Write .EQ 38 +LIBTCPIP.SKT.Read .EQ 50 +LIBTCPIP.SKT.ReadA .EQ 40 +LIBTCPIP.SKT.PutC .EQ 42 +LIBTCPIP.SKT.PutS .EQ 44 +LIBTCPIP.SKT.GetCA .EQ 46 +LIBTCPIP.SKT.GetS .EQ 48 *-------------------------------------- ERR.SKT.OOS .EQ $BF ERR.SKT.BUSY .EQ $BE @@ -132,26 +122,9 @@ S.DNSCACHE.IP .EQ 8 S.DNSCACHE .EQ 12 *-------------------------------------- S.SOCKET.SOCK .EQ 0 -S.SOCKET.SOCK.DGRAM .EQ $10 -S.SOCKET.SOCK.STREAM .EQ $20 -S.SOCKET.SOCK.RAW .EQ $30 -S.SOCKET.SOCK.MASK .EQ $70 - -S.SOCKET.SOCK.ACK .EQ $80 - -S.SOCKET.STATUS .EQ 0 -S.SOCKET.STATUS.CLOSED .EQ 0 -S.SOCKET.STATUS.LISTEN .EQ 1 -S.SOCKET.STATUS.SYNSENT .EQ 2 -S.SOCKET.STATUS.SYNRCVD .EQ 3 -S.SOCKET.STATUS.ESTBLSH .EQ 4 -S.SOCKET.STATUS.CLWAIT .EQ 5 -S.SOCKET.STATUS.LASTACK .EQ 6 -S.SOCKET.STATUS.FINWT1 .EQ 7 -S.SOCKET.STATUS.FINWT2 .EQ 8 -S.SOCKET.STATUS.CLOSING .EQ 9 -S.SOCKET.STATUS.TIMEWT .EQ 10 -S.SOCKET.STATUS.MASK .EQ $0F +S.SOCKET.SOCK.DGRAM .EQ 1 +S.SOCKET.SOCK.STREAM .EQ 2 +S.SOCKET.SOCK.RAW .EQ 3 S.SOCKET.SO .EQ 1 S.SOCKET.SO.DEBUG .EQ $01 @@ -164,8 +137,21 @@ S.SOCKET.SO.USELOOPBACK .EQ $40 S.SOCKET.SO.LINGER .EQ $80 S.SOCKET.RAW.PROTO .EQ 2 -S.SOCKET.STREAM.hInMem .EQ 2 -S.SOCKET.STREAM.hOutMem .EQ 3 + +S.SOCKET.TCP.STATUS .EQ 2 +S.SOCKET.TCP.STATUS.CLOSED .EQ 0 +S.SOCKET.TCP.STATUS.LISTEN .EQ 1 +S.SOCKET.TCP.STATUS.SYNSENT .EQ 2 +S.SOCKET.TCP.STATUS.SYNRCVD .EQ 3 +S.SOCKET.TCP.STATUS.ESTBLSH .EQ 4 +S.SOCKET.TCP.STATUS.CLWAIT .EQ 5 +S.SOCKET.TCP.STATUS.LASTACK .EQ 6 +S.SOCKET.TCP.STATUS.FINWT1 .EQ 7 +S.SOCKET.TCP.STATUS.FINWT2 .EQ 8 +S.SOCKET.TCP.STATUS.CLOSING .EQ 9 +S.SOCKET.TCP.STATUS.TIMEWT .EQ 10 + +S.SOCKET.TCP.OPTIONS .EQ 3 S.SOCKET.SRC.ADDR .EQ 4 S.SOCKET.SRC.PORT .EQ 8 @@ -191,8 +177,10 @@ S.SOCKET.SQ.INUSED .EQ 28 S.SOCKET.SQ.OUTUSED .EQ 30 S.SOCKET.SQ.SEQNUM .EQ 32 S.SOCKET.SQ.ACKNUM .EQ 36 +S.SOCKET.STREAM.hInMem .EQ 40 +S.SOCKET.STREAM.hOutMem .EQ 41 * -S.SOCKET .EQ 40 +S.SOCKET .EQ 42 *-------------------------------------- S.ETH.FRAMELEN .EQ 0 S.ETH.DSTMAC .EQ 2 @@ -219,7 +207,7 @@ S.ARP .EQ S.ETH+28 *-------------------------------------- S.IP.V.IHL.DSCP.ECN .EQ S.ETH+0 $0045, IPV4,HDR=5DWORDs S.IP.TOTAL.LENGTH .EQ S.ETH+2 -S.IP.IDENTIFICATION .EQ S.ETH+4 $0000 +S.IP.IDENTIFICATION .EQ S.ETH+4 S.IP.FRAGMENT.FLAGS .EQ S.ETH+6 S.IP.TTL .EQ S.ETH+8 S.IP.PROTOCOL .EQ S.ETH+9 diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index 9da9c215..75755e76 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -4,23 +4,29 @@ LOMEM $A00 INC 1 AUTO 6 .LIST OFF -*-------------------------------------- -ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE +*/-------------------------------------- +* #ARP.Clear +* Clear ARP Cache +* ##In : +* ##Out : +*\-------------------------------------- +ARP.Clear ldx #K.ARPCACHE.SIZE*S.ARPCACHE .1 stz ARP.CACHE-1,x dex bne .1 clc rts -*-------------------------------------- -* ARP.QUERY -* In: -* PULLW PTR to IP -* PULLW PTR to MAC (to fill) -* Out: -* CC: hit: MAC filled -* CS: missed -*-------------------------------------- -ARP.QUERY >PULLW ZPPtrIP IP +*/-------------------------------------- +* #ARP.Query +* Query ARP Cache and returns HW address +* ##In: +* PUSHW PTR to MAC (to fill) +* PUSHW PTR to IP +* ##Out: +* CC: hit: MAC filled +* CS: missed +*\-------------------------------------- +ARP.Query >PULLW ZPPtrIP IP >PULLW ZPPtrMAC MAC ldy #3 @@ -38,13 +44,14 @@ ARP.QUERY >PULLW ZPPtrIP IP bpl .2 clc .9 rts -*-------------------------------------- -* ARP.ADD -* In: -* PULLW PTR to IP -* PULLW PTR to MAC -*-------------------------------------- -ARP.ADD >PULLW ZPPtrIP IP +*/-------------------------------------- +* #ARP.Add +* Add a static ARP cache record +* ##In: +* PUSHW PTR to MAC +* PUSHW PTR to IP +*\-------------------------------------- +ARP.Add >PULLW ZPPtrIP IP >PULLW ZPPtrMAC MAC stz ARP.TmpCache+S.ARPCACHE.TTL @@ -78,12 +85,14 @@ ARP.ADD.I sta ARP.TmpCache clc rts -*-------------------------------------- -* ARP.GETCACHE -* Out: +*/-------------------------------------- +* #ARP.GetCache +* Return a Ptr to ARP Cache Table +* ##In: +* ##Out: * Y,A = PTR to ARP.CACHE -*-------------------------------------- -ARP.GETCACHE >LDYA L.ARP.CACHE +*\-------------------------------------- +ARP.GetCache >LDYA L.ARP.CACHE clc rts *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 420925d0..49fd9750 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -4,26 +4,32 @@ NEW INC 1 AUTO 6 .LIST OFF -*-------------------------------------- -DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE +*/-------------------------------------- +* #DNS.Clear +* Clear DNS Cache +* ##In : +* ##Out : +*\-------------------------------------- +DNS.Clear ldx #K.DNSCACHE.SIZE*S.DNSCACHE .1 stz DNS.CACHE-1,x dex bne .1 clc rts -*-------------------------------------- -* DNS.QUERY -* In: -* PULLW = hostname PTR to PSTR -* PULLW = PTR to IP to fill with cached data -* Out: +*/-------------------------------------- +* #DNS.Query +* Query DNS for specified host +* ##In: +* PUSHW = PTR to IP to fill with cached data +* PUSHW = hostname PTR to PSTR +* ##Out: * CC: hit: IP filled with address * CS: missed -*-------------------------------------- -DNS.QUERY >PULLW ZPPtrDNS Get host string +*\-------------------------------------- +DNS.Query >PULLW ZPPtrDNS Get host string >PULLW ZPPtrIP Get IP address to fill -DNS.QUERY.I jsr DNS.FIND.BY.NAME +DNS.Query.I jsr DNS.FIND.BY.NAME bcs DNS.REQUEST lda (ZPCachePtr) get status... @@ -105,7 +111,7 @@ DNS.REQUEST lda hDNSSocket1 >PUSHW DNS.MSG.LEN >PUSHW L.DNS.MSG >PUSHB hDNSSocket1 - jsr SKT.SEND + jsr SKT.Write lda hDNSSocket2 beq .3 @@ -113,18 +119,19 @@ DNS.REQUEST lda hDNSSocket1 >PUSHW DNS.MSG.LEN >PUSHW L.DNS.MSG >PUSHB hDNSSocket2 - jsr SKT.SEND + jsr SKT.Write .3 lda #ERR.DNS.PENDING .9 sec rts -*-------------------------------------- -* DNS.ADD -* In: -* PULLW = hostname PSTR to Add -* PULLW = PTR to IP -*-------------------------------------- -DNS.ADD >PULLW ZPPtrDNS Get host string +*/-------------------------------------- +* #DNS.Add +* Add a static DNS record +* ##In: +* PUSHW = PTR to IP +* PUSHW = hostname PSTR to Add +*\-------------------------------------- +DNS.Add >PULLW ZPPtrDNS Get host string >PULLW ZPPtrIP Get host IP address ldy #3 @@ -167,8 +174,14 @@ DNS.ADD.I sta DNS.TmpCache clc .9 rts -*-------------------------------------- -DNS.GETCACHE >LDYA L.DNS.CACHE +*/-------------------------------------- +* #DNS.GetCache +* Return a Ptr to DNS Cache Table +* ##In: +* ##Out: +* Y,A = PTR to DNS.CACHE +*\-------------------------------------- +DNS.GetCache >LDYA L.DNS.CACHE clc rts *-------------------------------------- @@ -355,13 +368,13 @@ DNS.FREE ldy #S.DNSCACHE.hNAME *-------------------------------------- DNS.POLL lda hDNSSocket1 beq .8 - jsr SKT.RCVDA + jsr SKT.ReadA bcs .8 jsr DNS.DecodeMsg lda hDNSSocket2 beq .8 - jsr SKT.RCVDA + jsr SKT.ReadA bcs .8 jsr DNS.DecodeMsg diff --git a/LIB/LIBTCPIP.S.FRM.txt b/LIB/LIBTCPIP.S.FRM.txt index 8eacbc3b..de7789c9 100644 --- a/LIB/LIBTCPIP.S.FRM.txt +++ b/LIB/LIBTCPIP.S.FRM.txt @@ -15,9 +15,9 @@ AUTO 6 *-------------------------------------- FRM.NewIP stx .8+1 >STYA ZPDataOutLen - cpx #S.IP.PROTOCOL.ICMP + cpx #S.IP.PROTOCOL.TCP bne .1 - lda #S.IP-2 + lda #S.TCP-2 bra .4 .1 cpx #S.IP.PROTOCOL.UDP @@ -25,10 +25,7 @@ FRM.NewIP stx .8+1 lda #S.UDP-2 bra .4 -.2 cpx #S.IP.PROTOCOL.TCP - bne * - - lda #S.TCP-2 +.2 lda #S.IP-2 bra .4 .4 sta .5+1 save Header len for reset later @@ -133,27 +130,6 @@ FRM.NewIP stx .8+1 .9 rts *-------------------------------------- -FRM.SendICMP - - bra FRM.SendIP -*-------------------------------------- -FRM.SendTCP - - bra FRM.SendIP -*-------------------------------------- -FRM.SendUDP lda ZPFrameOutLen - sec - sbc #S.IP-2 - - ldy #S.UDP.LENGTH+1 - sta (ZPFrameOutPtr),y - - lda ZPFrameOutLen+1 - sbc /S.IP-2 - - dey - sta (ZPFrameOutPtr),y -*-------------------------------------- FRM.SendIP ldx #3 Copy SRC.IP even if IP offload ldy #S.IP.SRC+3 for proper UDP/TCP CRC calculation @@ -223,6 +199,20 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload .3 cmp #S.IP.PROTOCOL.UDP bne .4 + + lda ZPFrameOutLen + sec + sbc #S.IP-2 + + ldy #S.UDP.LENGTH+1 + sta (ZPFrameOutPtr),y + + lda ZPFrameOutLen+1 + sbc /S.IP-2 + + dey + sta (ZPFrameOutPtr),y + jsr UDP.ComputeChecksum bra .5 diff --git a/LIB/LIBTCPIP.S.HST.txt b/LIB/LIBTCPIP.S.HST.txt index cce2c786..c478b217 100644 --- a/LIB/LIBTCPIP.S.HST.txt +++ b/LIB/LIBTCPIP.S.HST.txt @@ -5,14 +5,14 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -HST.GETBYNAME >PULLW ZPPtrDNS +HST.GetByName >PULLW ZPPtrDNS >PULLW ZPPtrIP jsr HST.ScanIP bcc .9 jmp DNS.QUERY.I .9 rts *-------------------------------------- -HST.GETBYADDR >PULLW ZPPtrIP +HST.GetByAddr >PULLW ZPPtrIP >PULLW ZPPtrDNS diff --git a/LIB/LIBTCPIP.S.ICMP.txt b/LIB/LIBTCPIP.S.ICMP.txt index 6e89ae0a..fd4ef3d6 100644 --- a/LIB/LIBTCPIP.S.ICMP.txt +++ b/LIB/LIBTCPIP.S.ICMP.txt @@ -66,7 +66,7 @@ ICMP.IN.ECHOREQ ldy #S.IP.DST+3 sta hFrameOut DO NOT DISCARD this frame,it is SOURCE frame!!! >LDYA ZPFrameInPtr >STYA ZPFrameOutPtr - jmp FRM.SendICMP + jmp FRM.SendIP ICMP.IN.EXIT lda hFrameIn >SYSCALL FreeMemA @@ -92,7 +92,6 @@ ICMP.IN.ECHOREP jsr IP.FillTmpSocketSrcDst .3 lda (ZPPtrSKT) beq .7 - and #S.SOCKET.SOCK.MASK cmp #S.SOCKET.SOCK.RAW bne .7 diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 9cea497e..76b7bf2e 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -82,7 +82,6 @@ SKT.New >PULLW ZPTmpPtr1 bpl .7 lda (ZPTmpPtr1) - and #S.SOCKET.SOCK.MASK cmp #S.SOCKET.SOCK.STREAM bne .8 @@ -149,440 +148,6 @@ SKT.New.TCP ldy #S.SOCKET.SQ.INFREE clc .9 rts */-------------------------------------- -* #SKT.AcceptA -* Check for an incoming connection -* ##In : -* A = hListeningSocket -* ##Out : -* A = hSocket -*\-------------------------------------- -SKT.AcceptA jsr SKT.GetA.I - bcs .9 - ldy #S.SOCKET.SO - lda (ZPPtrSKT),y - and #S.SOCKET.SO.ACCEPTCONN - bne .99 - - ldy #S.SOCKET.HQ.HEAD - lda (ZPPtrSKT),y - ldy #S.SOCKET.HQ.TAIL - cmp (ZPPtrSKT),y Queue Empty - beq .9 CC - - pha - inc - cmp #S.SOCKET.HQ.MAX - bne .1 - - lda #0 - -.1 sta (ZPPtrSKT),y - pla - clc - adc #S.SOCKET.HQ - tay - lda (ZPPtrSKT),y - clc - rts - -.99 lda #ERR.SKT.BAD - sec -.9 rts -*/-------------------------------------- -* #SKT.Send (DGRAM,STREAM,RAW) -* Send block of data -* ##In : -* PUSHB = hSocket -* PUSHW = pBuf -* PUSHW = len -* ##Out : -* A = hFrame -*\-------------------------------------- -SKT.Send >PULLW ZPDataInLen - >PULLW ZPDataInPtr - >PULLB hSocket - - jsr SKT.GetA.I - bcs .9 - - and #S.SOCKET.SOCK.MASK - cmp #S.SOCKET.SOCK.DGRAM - beq SKT.SEND.UDP - - cmp #S.SOCKET.SOCK.STREAM - bne .1 - - ldy #S.SOCKET.SO - lda (ZPPtrSKT),y - and #S.SOCKET.SO.ACCEPTCONN - bne .99 - jmp SKT.SEND.TCP - -.1 cmp #S.SOCKET.SOCK.RAW - bne .99 - jmp SKT.SEND.RAW - -.99 lda #ERR.SKT.BAD - sec -.9 rts -*-------------------------------------- -SKT.SEND.UDP ldx #S.IP.PROTOCOL.UDP - >LDYA ZPDataInLen - jsr FRM.NewIP - bcs .9 - - jsr SKT.SetFrameOutDstIP - - jsr SKT.SetFrameOutPorts - - jsr SKT.CopyDataInToOut - - jmp FRM.SendUDP - -.9 rts -*-------------------------------------- -SKT.SEND.RAW ldy #S.SOCKET.RAW.PROTO - lda (ZPPtrSKT),y - - tax - >LDYA ZPDataInLen - jsr FRM.NewIP - bcs .9 - - jsr SKT.SetFrameOutDstIP - - jsr SKT.CopyDataInToOut - - ldy #S.SOCKET.RAW.PROTO - lda (ZPPtrSKT),y - cmp #S.IP.PROTOCOL.ICMP - bne .1 - jmp FRM.SendICMP -.1 jmp FRM.SendIP - -.9 sec - rts -*-------------------------------------- -SKT.SEND.TCP ldy #S.SOCKET.STATUS - lda (ZPPtrSKT),y - and #S.SOCKET.STATUS.MASK - cmp #S.SOCKET.STATUS.ESTBLSH - beq .10 - - lda #MLI.ERR.IO -* sec CS from cmp - rts - -.10 ldy #S.SOCKET.STREAM.hOutMem - lda (ZPPtrSKT),y - >SYSCALL GetMemPtrA - >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base - - ldy #S.SOCKET.SQ.OUTFREE - lda (ZPPtrSKT),y - sec - sbc ZPDataInLen - tax - - iny - lda (ZPPtrSKT),y - sbc ZPDataInLen+1 X,A = new OUTFREE - bcc .91 - - sta (ZPPtrSKT),y - dey - txa - sta (ZPPtrSKT),y Update Socket OUTFREE - - ldy #S.SOCKET.SQ.OUTHEAD - lda (ZPPtrSKT),y - tax - clc - adc ZPDataInLen - sta (ZPPtrSKT),y - - iny - lda (ZPPtrSKT),y - pha - adc ZPDataInLen+1 - and /K.TCP.WMASK - sta (ZPPtrSKT),y Update Socket new OUTHEAD - - txa X,PHA=OUTHEAD - clc - adc ZPTmpPtr1 - sta ZPTmpPtr2 - pla - pha - adc ZPTmpPtr1+1 Ptr1=Current Base - sta ZPTmpPtr1+2 Ptr2=Current Base+OUTHEAD - - stx ZPTmpPtr3 - pla - clc - adc /65536-K.TCP.WSIZE - sta ZPTmpPtr3+1 Ptr3=!(K.TCP.WSIZE-OUTHEAD) - - lda ZPDataInLen - eor #$ff - sta ZPDataInLen - - lda ZPDataInLen+1 - eor #$ff - sta ZPDataInLen+1 ZPDataInLen=!ZPDataInLen - - ldy #0 - -.1 inc ZPTmpPtr3 Reached the TOP of buf ? - bne .2 - inc ZPTmpPtr3+1 - beq .5 - -.2 inc ZPDataInLen - bne .3 - inc ZPDataInLen+1 - beq .80 - -.3 lda (ZPDataInPtr),y - sta (ZPTmpPtr2) - iny - bne .4 - - inc ZPDataInPtr+1 - -.4 inc ZPTmpPtr2 - bne .1 - - inc ZPTmpPtr2+1 - bra .1 - -.5 inc ZPDataInLen - bne .6 - inc ZPDataInLen+1 - beq .80 - -.6 lda (ZPDataInPtr),y - sta (ZPTmpPtr1) - iny - bne .7 - - inc ZPDataInPtr+1 - -.7 inc ZPTmpPtr1 - bne .5 - - inc ZPTmpPtr1+1 - bra .6 - -.80 clc - rts - - - -.91 lda #MLI.ERR.VOLFULL - sec - rts -*/-------------------------------------- -* #SKT.RcvdA (DGRAM,RAW) -* ##In : -* A = hSocket -* ##Out : -* A = hFrame -*\-------------------------------------- -SKT.RcvdA jsr SKT.GetA.I - bcs .9 - - ldy #S.SOCKET.HQ.TAIL - lda (ZPPtrSKT),y - tax - - ldy #S.SOCKET.HQ.HEAD - cmp (ZPPtrSKT),y - beq .99 - - inc - cmp #S.SOCKET.HQ.MAX - bne .1 - lda #0 - -.1 ldy #S.SOCKET.HQ.TAIL - sta (ZPPtrSKT),y - - txa - clc - adc #S.SOCKET.HQ - tay - lda (ZPPtrSKT),y - clc - rts - -.99 sec -.9 rts -*/-------------------------------------- -* #SKT.GetCA (STREAM) -* Read a Char From Stream in A -* ##In : -* A = hSocket -* ##Out : -* A = char -*\-------------------------------------- -SKT.GetCA sec - rts -*/-------------------------------------- -* #SKT.GetS (STREAM) -* Read a CR terminated Line in pBuf -* ##In : -* PUSHB = hSocket -* PUSHW = pBuf -* PUSHW = len -* ##Out : -* Y,A = bytes read -*\-------------------------------------- -SKT.GetS sec - .HS 90 bcc -*/-------------------------------------- -* #SKT.Rcvd (STREAM) -* Read data in pBuf -* ##In : -* PUSHB = hSocket -* PUSHW = pBuf -* PUSHW = len -* ##Out : -* Y,A = bytes transfered -*\-------------------------------------- -SKT.Rcvd clc - ror TmpDWord - >PULLA - eor #$FF - sta ZPDataOutLen - >PULLA - eor #$FF - sta ZPDataOutLen+1 - - >PULLW ZPDataOutPtr - >PULLB hSocket - - jsr SKT.GetA.I - bcs .99 - and #S.SOCKET.SOCK.MASK - cmp #S.SOCKET.SOCK.STREAM - bne .9 - - ldy #S.SOCKET.SO - lda (ZPPtrSKT),y - and #S.SOCKET.SO.ACCEPTCONN - beq SKT.Rcvd.1 - -.9 lda #ERR.SKT.BAD - sec -.99 rts - -SKT.Rcvd.1 jsr SKT.GetCopy - - lda SKT.TmpCache+S.SOCKET.STREAM.hOutMem - >SYSCALL GetMemPtrA - >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base - - lda ZPTmpPtr1 - clc - adc SKT.TmpCache+S.SOCKET.SQ.INTAIL - sta ZPTmpPtr2 - - lda ZPTmpPtr1+1 - adc SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 - sta ZPTmpPtr2+1 - - stz TmpOffset Reset Data Counter - stz TmpOffset+1 - - ldy #0 - -.2 inc ZPDataOutLen Room left in dest buffer ? - bne .3 - inc ZPDataOutLen+1 - beq .8 - -.3 lda SKT.TmpCache+S.SOCKET.SQ.INTAIL - eor SKT.TmpCache+S.SOCKET.SQ.INHEAD - bne .4 - lda SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 - eor SKT.TmpCache+S.SOCKET.SQ.INHEAD+1 - beq .8 no more data.... - -.4 lda (ZPTmpPtr2) - - inc SKT.TmpCache+S.SOCKET.SQ.INTAIL - bne .6 - - inc SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 - ldx SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 - cpx /K.TCP.WSIZE - bne .5 - - stz SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 - ldx ZPTmpPtr1 - stx ZPTmpPtr2 - ldx ZPTmpPtr1+1 - stx ZPTmpPtr2+1 - bra .6 - -.5 inc ZPTmpPtr2 - bne .6 - inc ZPTmpPtr2+1 - -.6 bit TmpDWord do we need to check CR ? - bpl .7 - - cmp #13 - beq .80 - -.7 sta (ZPDataOutPtr),y - iny - bne .2 - inc ZPDataOutPtr+1 - bra .2 - -.8 lda TmpDWord CR mode ? - bne .90 - -.80 lda TmpOffset - eor TmpOffset+1 - beq .9 - - lda S.SOCKET.SQ.INFREE - clc - adc TmpOffset - sta S.SOCKET.SQ.INFREE - - lda S.SOCKET.SQ.INFREE+1 - adc TmpOffset+1 - sta S.SOCKET.SQ.INFREE+1 - - lda SKT.TmpCache+S.SOCKET.SQ.ACKNUM - clc - adc TmpOffset - sta SKT.TmpCache+S.SOCKET.SQ.ACKNUM - - lda SKT.TmpCache+S.SOCKET.SQ.ACKNUM+1 - adc TmpOffset+1 - sta SKT.TmpCache+S.SOCKET.SQ.ACKNUM+1 - bcc .81 - inc SKT.TmpCache+S.SOCKET.SQ.ACKNUM+2 - bne .81 - inc SKT.TmpCache+S.SOCKET.SQ.ACKNUM+3 - -.81 lda #S.SOCKET.SOCK.ACK - tsb SKT.TmpCache+S.SOCKET.SOCK - - jsr SKT.PutCopy - >LDYA TmpOffset - clc - rts - -.90 lda #0 -.9 sec A=0, no data - rts -*/-------------------------------------- * #SKT.CloseA * Close socket * ##In : @@ -595,7 +160,6 @@ SKT.CloseA cmp #K.SKTTABLE.SIZE jsr SKT.GetA.I bcs .9 - and #S.SOCKET.SOCK.MASK cmp #S.SOCKET.SOCK.DGRAM beq .8 @@ -670,6 +234,287 @@ SKT.GetTable lda hSocketTable >SYSCALL GetMemPtrA clc rts +*/-------------------------------------- +* #SKT.AcceptA +* Check for an incoming connection +* ##In : +* A = hListeningSocket +* ##Out : +* A = hSocket +*\-------------------------------------- +SKT.AcceptA jsr SKT.GetA.I + bcs .9 + ldy #S.SOCKET.SO + lda (ZPPtrSKT),y + and #S.SOCKET.SO.ACCEPTCONN + bne .99 + + ldy #S.SOCKET.HQ.HEAD + lda (ZPPtrSKT),y + ldy #S.SOCKET.HQ.TAIL + cmp (ZPPtrSKT),y Queue Empty + beq .9 CC + + pha + inc + cmp #S.SOCKET.HQ.MAX + bne .1 + + lda #0 + +.1 sta (ZPPtrSKT),y + pla + clc + adc #S.SOCKET.HQ + tay + lda (ZPPtrSKT),y + clc + rts + +.99 lda #ERR.SKT.BAD + sec +.9 rts +*/-------------------------------------- +* #SKT.Send (DGRAM,STREAM,RAW) +* Send block of data +* ##In : +* PUSHB = hSocket +* PUSHW = pBuf +* PUSHW = len +* ##Out : +* A = hFrame +*\-------------------------------------- +SKT.Write >PULLW ZPDataInLen + >PULLW ZPDataInPtr + >PULLB hSocket + + jsr SKT.GetA.I + bcs .9 + + cmp #S.SOCKET.SOCK.DGRAM + beq SKT.Write.UDP + + cmp #S.SOCKET.SOCK.STREAM + bne .1 + + ldy #S.SOCKET.SO + lda (ZPPtrSKT),y + and #S.SOCKET.SO.ACCEPTCONN + bne .99 + jmp SKT.Write.TCP + +.1 cmp #S.SOCKET.SOCK.RAW + bne .99 + jmp SKT.Write.RAW + +.99 lda #ERR.SKT.BAD + sec +.9 rts +*-------------------------------------- +SKT.Write.UDP ldx #S.IP.PROTOCOL.UDP + >LDYA ZPDataInLen + jsr FRM.NewIP + bcs .9 + + jsr SKT.SetFrameOutDstIP + + jsr SKT.SetFrameOutPorts + + jsr SKT.CopyDataInToOut + + jmp FRM.SendIP + +.9 rts +*-------------------------------------- +SKT.Write.RAW ldy #S.SOCKET.RAW.PROTO + lda (ZPPtrSKT),y + + tax + >LDYA ZPDataInLen + jsr FRM.NewIP + bcs .9 + + jsr SKT.SetFrameOutDstIP + + jsr SKT.CopyDataInToOut + + jmp FRM.SendIP + +.9 sec + rts +*-------------------------------------- +SKT.Write.TCP ldy #S.SOCKET.TCP.STATUS + lda (ZPPtrSKT),y + cmp #S.SOCKET.TCP.STATUS.ESTBLSH + bne .91 + + jsr SKT.AddDataToSktOut + bcs .90 + + jsr TCP.OUT try to push, ignore error.... + clc + rts + +.90 lda #0 no data transfered + sec + rts + +.91 lda #MLI.ERR.IO + sec +.99 rts +*/-------------------------------------- +* #SKT.RcvdA (DGRAM,RAW) +* ##In : +* A = hSocket +* ##Out : +* A = hFrame +*\-------------------------------------- +SKT.ReadA jsr SKT.GetA.I + bcs .9 + + ldy #S.SOCKET.HQ.TAIL + lda (ZPPtrSKT),y + tax + + ldy #S.SOCKET.HQ.HEAD + cmp (ZPPtrSKT),y + beq .99 + + inc + cmp #S.SOCKET.HQ.MAX + bne .1 + lda #0 + +.1 ldy #S.SOCKET.HQ.TAIL + sta (ZPPtrSKT),y + + txa + clc + adc #S.SOCKET.HQ + tay + lda (ZPPtrSKT),y + clc + rts + +.99 sec +.9 rts +*/-------------------------------------- +* #SKT.PutC (STREAM) +* Write a Char To Stream +* ##In : +* PUSHB = hSocket +* PUSHB = Char +* ##Out : +* A = char +*\-------------------------------------- +SKT.PutC sec + rts +*/-------------------------------------- +* #SKT.PutS (STREAM) +* Write Line in pBuf +* ##In : +* PUSHB = hSocket +* PUSHW = PSTR +* ##Out : +*\-------------------------------------- +SKT.PutS + sec + rts +*/-------------------------------------- +* #SKT.GetCA (STREAM) +* Read a Char From Stream in A +* ##In : +* A = hSocket +* ##Out : +* A = char +*\-------------------------------------- +SKT.GetCA sec + rts +*/-------------------------------------- +* #SKT.GetS (STREAM) +* Read a CR terminated Line in pBuf +* ##In : +* PUSHB = hSocket +* PUSHW = pBuf +* PUSHW = len +* ##Out : +* Y,A = bytes read +*\-------------------------------------- +SKT.GetS sec + .HS 90 bcc +*/-------------------------------------- +* #SKT.Read (STREAM) +* Read data in pBuf +* ##In : +* PUSHB = hSocket +* PUSHW = pBuf +* PUSHW = len +* ##Out : +* Y,A = bytes transfered +*\-------------------------------------- +SKT.Read clc + ror bTextMode + >PULLW ZPDataOutLen + >PULLW ZPDataOutPtr + >PULLB hSocket + + jsr SKT.GetA.I + bcs .99 + cmp #S.SOCKET.SOCK.STREAM + bne .90 bad skt + + ldy #S.SOCKET.SO + lda (ZPPtrSKT),y + and #S.SOCKET.SO.ACCEPTCONN + bne .90 Bad Skt + + ldy #S.SOCKET.TCP.STATUS + lda (ZPPtrSKT),y + cmp #S.SOCKET.TCP.STATUS.ESTBLSH + bne .91 IO err + + jsr SKT.GetDataFromSktIn + bcs .99 No data... + + >STYA TmpOffset + ldy #S.SOCKET.SQ.ACKNUM + lda (ZPPtrSKT),y + clc + adc TmpOffset + sta (ZPPtrSKT),y + + iny + lda (ZPPtrSKT),y + adc TmpOffset+1 + sta (ZPPtrSKT),y + + iny + lda (ZPPtrSKT),y + adc #0 + sta (ZPPtrSKT),y + iny + lda (ZPPtrSKT),y + adc #0 + sta (ZPPtrSKT),y + + ldy #S.SOCKET.TCP.OPTIONS + lda (ZPPtrSKT),y + ora #S.TCP.OPTIONS.ACK + sta (ZPPtrSKT),y + + >LDYA TmpOffset + clc + rts + +.90 lda #ERR.SKT.BAD + sec + rts + +.91 lda #MLI.ERR.IO + sec +.99 rts +*-------------------------------------- +* PRIVATE *-------------------------------------- * ZPPtrSKT -> actual socket * A = hSocket or hFrame @@ -701,11 +546,375 @@ SKT.AddToQueueA sta .2+1 .9 sec rts *-------------------------------------- -SKT.AddToQueueS +* From TCP.IN +* Src : ZPDataInPtr/ZPDataInLen +* Dst : hInMem/INHEAD +*-------------------------------------- +SKT.AddDataToSktIn + jsr SKT.GetCopy + + ldx ZPDataInLen + cpx SKT.TmpCache+S.SOCKET.SQ.INFREE + lda ZPDataInLen+1 + sbc SKT.TmpCache+S.SOCKET.SQ.INFREE+1 + bcc .9 Not enough room in Q + + lda SKT.TmpCache+S.SOCKET.STREAM.hInMem + >SYSCALL GetMemPtrA + >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base + + lda ZPTmpPtr1 + clc + adc SKT.TmpCache+S.SOCKET.SQ.INHEAD + sta ZPTmpPtr2 + + lda ZPTmpPtr1+1 + adc SKT.TmpCache+S.SOCKET.SQ.INHEAD+1 + sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail + + lda ZPDataInLen + eor #$FF + tax + + lda ZPDataInLen+1 + eor #$FF + pha + + ldy #0 + +.1 inx + bne .2 + pla + inc + beq .8 + +.2 lda (ZPDataInPtr),y + sta (ZPTmpPtr2) + iny + bne .3 + inc ZPDataInPtr+1 + +.3 inc ZPTmpPtr2 + bne .4 + inc ZPTmpPtr2+1 + +.4 inc SKT.TmpCache+S.SOCKET.SQ.INHEAD + bne .1 + inc SKT.TmpCache+S.SOCKET.SQ.INHEAD+1 + lda SKT.TmpCache+S.SOCKET.SQ.INHEAD+1 + cmp /K.TCP.WSIZE + bne .1 + stz SKT.TmpCache+S.SOCKET.SQ.INHEAD+1 + + lda ZPTmpPtr1 Dst Ptr=Buffer Base + sta ZPTmpPtr2 + lda ZPTmpPtr1+1 + sta ZPTmpPtr2+1 + bra .1 + +.9 sec + rts + +.8 lda SKT.TmpCache+S.SOCKET.SQ.INFREE + sec + sbc ZPDataInLen + sta SKT.TmpCache+S.SOCKET.SQ.INFREE + lda SKT.TmpCache+S.SOCKET.SQ.INFREE+1 + sbc ZPDataInLen+1 + sta SKT.TmpCache+S.SOCKET.SQ.INFREE+1 + + lda SKT.TmpCache+S.SOCKET.SQ.INUSED + clc + adc ZPDataInLen + sta SKT.TmpCache+S.SOCKET.SQ.INUSED + lda SKT.TmpCache+S.SOCKET.SQ.INUSED+1 + adc ZPDataInLen+1 + sta SKT.TmpCache+S.SOCKET.SQ.INUSED+1 + + jsr SKT.PutCopy + clc + rts +*-------------------------------------- +* From SKT.SEND.TCP +* Src : ZPDataInPtr/ZPDataInLen +* Dst : hOutMem/OUTHEAD +*-------------------------------------- +SKT.AddDataToSktOut + jsr SKT.GetCopy + + ldx ZPDataInLen + cpx SKT.TmpCache+S.SOCKET.SQ.OUTFREE + lda ZPDataInLen+1 + sbc SKT.TmpCache+S.SOCKET.SQ.OUTFREE+1 + bcc .9 Not enough room in Q + + lda SKT.TmpCache+S.SOCKET.STREAM.hOutMem + >SYSCALL GetMemPtrA + >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base + + lda ZPTmpPtr1 + clc + adc SKT.TmpCache+S.SOCKET.SQ.OUTHEAD + sta ZPTmpPtr2 + + lda ZPTmpPtr1+1 + adc SKT.TmpCache+S.SOCKET.SQ.OUTHEAD+1 + sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail + + lda ZPDataInLen + eor #$FF + tax + + lda ZPDataInLen+1 + eor #$FF + pha + + ldy #0 + +.1 inx + bne .2 + pla + inc + beq .8 + +.2 lda (ZPDataInPtr),y + sta (ZPTmpPtr2) + iny + bne .3 + inc ZPDataInPtr+1 + +.3 inc ZPTmpPtr2 + bne .4 + inc ZPTmpPtr2+1 + +.4 inc SKT.TmpCache+S.SOCKET.SQ.OUTHEAD + bne .1 + inc SKT.TmpCache+S.SOCKET.SQ.OUTHEAD+1 + lda SKT.TmpCache+S.SOCKET.SQ.OUTHEAD+1 + cmp /K.TCP.WSIZE + bne .1 + stz SKT.TmpCache+S.SOCKET.SQ.OUTHEAD+1 + + lda ZPTmpPtr1 Dst Ptr=Buffer Base + sta ZPTmpPtr2 + lda ZPTmpPtr1+1 + sta ZPTmpPtr2+1 + bra .1 + +.9 sec + rts + +.8 lda SKT.TmpCache+S.SOCKET.SQ.OUTFREE + sec + sbc ZPDataInLen + sta SKT.TmpCache+S.SOCKET.SQ.OUTFREE + lda SKT.TmpCache+S.SOCKET.SQ.OUTFREE+1 + sbc ZPDataInLen+1 + sta SKT.TmpCache+S.SOCKET.SQ.OUTFREE+1 + + lda SKT.TmpCache+S.SOCKET.SQ.OUTUSED + clc + adc ZPDataInLen + sta SKT.TmpCache+S.SOCKET.SQ.OUTUSED + lda SKT.TmpCache+S.SOCKET.SQ.OUTUSED+1 + adc ZPDataInLen+1 + sta SKT.TmpCache+S.SOCKET.SQ.OUTUSED+1 + + jsr SKT.PutCopy + clc + rts +*-------------------------------------- +* From TCP.OUT +* Src : hOutMem/OUTTAIL +* Dst : ZPDataOutPtr/ZPDataOutLen +*-------------------------------------- +SKT.GetDataFromSktOut + jsr SKT.GetCopy + + lda SKT.TmpCache+S.SOCKET.STREAM.hOutMem + >SYSCALL GetMemPtrA + >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base + + lda ZPTmpPtr1 + clc + adc SKT.TmpCache+S.SOCKET.SQ.OUTTAIL + sta ZPTmpPtr2 + + lda ZPTmpPtr1+1 + adc SKT.TmpCache+S.SOCKET.SQ.OUTTAIL+1 + sta ZPTmpPtr2+1 + + lda ZPDataOutLen + eor #$FF + tax + + lda ZPDataOutLen+1 + eor #$FF + pha + + ldy #0 + +.1 inx + bne .2 + pla + inc + beq .8 + +.2 lda (ZPTmpPtr2) + sta (ZPDataOutPtr),y + iny + bne .3 + inc ZPDataOutPtr+1 + +.3 inc ZPTmpPtr2 + bne .4 + inc ZPTmpPtr2+1 + +.4 inc SKT.TmpCache+S.SOCKET.SQ.OUTTAIL + bne .1 + inc SKT.TmpCache+S.SOCKET.SQ.OUTTAIL+1 + lda SKT.TmpCache+S.SOCKET.SQ.OUTTAIL+1 + cmp /K.TCP.WSIZE + bne .1 + stz SKT.TmpCache+S.SOCKET.SQ.OUTTAIL+1 + + lda ZPTmpPtr1 Dst Ptr=Buffer Base + sta ZPTmpPtr2 + lda ZPTmpPtr1+1 + sta ZPTmpPtr2+1 + bra .1 + +.8 clc + rts +*-------------------------------------- +* From SKT.RCVD +* In: +* Src : hInMem/INTAIL +* Dst : ZPDataOutPtr/ZPDataOutLen +* CS : Text Mode +* CC : Binary Mode +* Out: +* Y,A = bytes read +*-------------------------------------- +SKT.GetDataFromSktIn + ldy #S.SOCKET.STREAM.hInMem + lda (ZPPtrSKT),y + >SYSCALL GetMemPtrA + >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base + + jsr SKT.GetCopy + + lda ZPTmpPtr1 + clc + adc SKT.TmpCache+S.SOCKET.SQ.INTAIL + sta ZPTmpPtr2 + + lda ZPTmpPtr1+1 + adc SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 + sta ZPTmpPtr2+1 + + lda ZPDataOutLen + eor #$FF + tax + + lda ZPDataOutLen+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 + inc + beq .7 + pha + +.2 lda SKT.TmpCache+S.SOCKET.SQ.INTAIL + eor SKT.TmpCache+S.SOCKET.SQ.INHEAD + bne .3 + lda SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 + eor SKT.TmpCache+S.SOCKET.SQ.INHEAD+1 + beq .8 no more data.... + +.3 lda (ZPTmpPtr2) + pha + + inc SKT.TmpCache+S.SOCKET.SQ.INTAIL + bne .5 + + inc SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 + lda SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 + cmp /K.TCP.WSIZE + bne .4 + + stz SKT.TmpCache+S.SOCKET.SQ.INTAIL+1 + lda ZPTmpPtr1 + sta ZPTmpPtr2 + lda ZPTmpPtr1+1 + sta ZPTmpPtr2+1 + bra .5 + +.4 inc ZPTmpPtr2 + bne .4 + inc ZPTmpPtr2+1 + +.5 pla get back data.... + + bit bTextMode do we need to check CR ? + bpl .6 + + cmp #13 + beq .8 + +.6 sta (ZPDataOutPtr),y + iny + bne .61 + inc ZPDataOutPtr+1 + +.61 inc ZPTmpPtr3 + bne .1 + inc ZPTmpPtr3+1 + + bra .1 + +.7 bit bTextMode here, bacause dst buf full.... + bmi .9 ....and TextMode selected, NO ending CR found + +.8 pla discard byte counter HI + + lda ZPTmpPtr3 Do we have transfered something? + eor ZPTmpPtr3+1 + beq .9 + + lda SKT.TmpCache+S.SOCKET.SQ.INFREE + clc + adc ZPTmpPtr3 + sta SKT.TmpCache+S.SOCKET.SQ.INFREE + + lda SKT.TmpCache+S.SOCKET.SQ.INFREE+1 + adc ZPTmpPtr3+1 + sta SKT.TmpCache+S.SOCKET.SQ.INFREE+1 + + lda SKT.TmpCache+S.SOCKET.SQ.INUSED + sec + sbc ZPTmpPtr3 + sta SKT.TmpCache+S.SOCKET.SQ.INUSED + + lda SKT.TmpCache+S.SOCKET.SQ.INUSED+1 + sbc ZPTmpPtr3+1 + sta SKT.TmpCache+S.SOCKET.SQ.INUSED+1 + + jsr SKT.PutCopy + >LDYA ZPTmpPtr3 clc rts -.9 sec +.9 lda #0 NO DATA + sec rts *-------------------------------------- SKT.GetCopy ldy #S.SOCKET-1 diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 6da32ac7..c6de1715 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -52,6 +52,7 @@ TCP.IN ldy #S.IP.SRC+3 .4 lda TmpSocket,y cmp (ZPPtrSKT),y bne .7 Not for this socket... + iny cpy #S.SOCKET.SRC.PORT+2 bne .4 @@ -139,14 +140,14 @@ TCP.IN.LISTEN.NEW lda #ERR.SKT.OOS .9 rts -.3 ldy #S.SOCKET.STATUS - lda #S.SOCKET.STATUS.SYNRCVD +.3 ldy #S.SOCKET.TCP.STATUS + lda #S.SOCKET.TCP.STATUS.SYNRCVD sta (ZPPtrSKT),y jmp TCP.SendSYNACK *-------------------------------------- TCP.IN.REGULAR stx hSocket - ldy #S.SOCKET.STATUS + ldy #S.SOCKET.TCP.STATUS lda (ZPPtrSKT),y asl tax @@ -191,8 +192,8 @@ TCP.IN.JMP.SYNRCVD dex bpl .12 - ldy #S.SOCKET.STATUS - lda #S.SOCKET.STATUS.ESTBLSH + ldy #S.SOCKET.TCP.STATUS + lda #S.SOCKET.TCP.STATUS.ESTBLSH sta (ZPPtrSKT),y @@ -208,7 +209,7 @@ TCP.IN.JMP.ESTBLSH jsr TCP.UpdateSktAckNum .1 jsr TCP.SetDataInPtrAndLen - jsr TCP.AddDataToSkt + jsr SKT.AddDataToSktIn clc @@ -223,12 +224,18 @@ TCP.IN.JMP.TIMEWT clc rts *-------------------------------------- -TCP.OUT jsr SKT.GetCopy +TCP.OUT ldy #S.SOCKET.SQ.OUTUSED + lda (ZPPtrSKT),y - lda SKT.TmpCache+S.SOCKET.SQ.OUTUSED+1 + pha + + iny + lda (ZPPtrSKT),y + ply bne .1 - ldy SKT.TmpCache+S.SOCKET.SQ.OUTUSED - beq .8 nothing to send....go check if ACK pending + + tax + beq .2 Y,A=0 : nothing to send.... .1 cpy #K.TCP.MSS pha @@ -236,15 +243,75 @@ TCP.OUT jsr SKT.GetCopy pla bcs .2 no....get data len - >LDYAI K.TCP.MSS yes gert only MSS + >LDYAI K.TCP.MSS yes get only MSS -.2 >STYA ZPDataOutLen +.2 >STYA TmpOffset + + ldx #S.IP.PROTOCOL.TCP + jsr FRM.NewIP + bcs .9 + + jsr SKT.GetDataFromSktOut + ldy #S.SOCKET.SQ.SEQNUM compute new SEQ.NUM + lda (ZPPtrSKT),y + clc + adc TmpOffset + sta TmpDWord - jmp FRM.SendTCP + iny + lda (ZPPtrSKT),y + adc TmpOffset+1 + sta TmpDWord+1 + + iny + lda (ZPPtrSKT),y + adc #0 + sta TmpDWord+2 + + iny + lda (ZPPtrSKT),y + adc #0 + sta TmpDWord+3 + + ldy #S.TCP.SEQ.NUMBER+3 + ldx #3 + +.3 lda TmpDWord,x + sta (ZPFrameOutPtr),y + dey + dex + bpl .3 + + ldy #S.SOCKET.TCP.OPTIONS + lda (ZPPtrSKT),y + bit #S.TCP.OPTIONS.ACK + beq .7 + + ldy #S.TCP.OPTIONS + lda (ZPFrameOutPtr),y + ora #S.TCP.OPTIONS.ACK + sta (ZPFrameOutPtr),y + +.7 jsr FRM.SendIP + bcs .9 + + ldy #S.SOCKET.SOCK + lda (ZPPtrSKT),y + and #$ff^S.TCP.OPTIONS.ACK + sta (ZPPtrSKT),y + + ldx #3 + ldy #S.SOCKET.SQ.SEQNUM+3 + +.71 lda TmpDWord,x + sta (ZPPtrSKT),y + dey + dex + bpl .71 .8 clc - rts +.9 rts *-------------------------------------- TCP.UpdateSktAckNum ldy #S.SOCKET.SQ.ACKNUM+3 @@ -318,83 +385,9 @@ TCP.SetDataInPtrAndLen sta ZPDataInLen+1 rts *-------------------------------------- -TCP.AddDataToSkt - ldy #S.SOCKET.STREAM.hInMem - lda (ZPPtrSKT),y - >SYSCALL GetMemPtrA - >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base - - ldy #S.SOCKET.SQ.INHEAD - lda (ZPPtrSKT),y - tax save LO for compare later - clc - adc ZPTmpPtr1 - sta ZPTmpPtr2 Make ZPTmpPtr2=actual head - iny - lda (ZPPtrSKT),y - pha save HI for compare later - adc ZPTmpPtr1+1 - sta ZPTmpPtr2+1 - - lda ZPDataInLen - eor #$ff - sta ZPTmpPtr3 Make ZPTmpPtr3=!count - lda ZPDataInLen+1 - eor #$ff - sta ZPTmpPtr3+1 - - ldy #0 - -.1 inc ZPTmpPtr3 - bne .2 - inc ZPTmpPtr3+1 - beq .9 - -.2 lda (ZPDataInPtr),y - sta (ZPTmpPtr2) - - iny - bne .3 - inc ZPDataInPtr+1 - -.3 inc ZPTmpPtr2 - bne .4 - inc ZPTmpPtr2+1 - -.4 pla - inx - bne .5 - inc -.5 pha - cpx #K.TCP.WSIZE - sbc /K.TCP.WSIZE - bcc .1 - -.6 inc ZPTmpPtr3 - bne .7 - inc ZPTmpPtr3+1 - beq .9 - -.7 lda (ZPDataInPtr),y - sta (ZPTmpPtr1) - - iny - bne .8 - inc ZPDataInPtr+1 - -.8 inc ZPTmpPtr1 - bne .6 - inc ZPTmpPtr1+1 - bra .6 - -.9 pla - rts -*-------------------------------------- -TCP.SendACK lda #S.TCP.OPTIONS.ACK - bra TCP.SendMSG TCP.SendSYNACK lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK -TCP.SendMSG sta TCP.MSG+S.TCP.OPTIONS + sta TCP.MSG+S.TCP.OPTIONS ldy #S.SOCKET.SRC.ADDR+3 ldx #3 diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 599f23ca..e9ce9576 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -52,23 +52,12 @@ CS.START cld .1 .DA LIB.LOAD .DA LIB.UNLOAD + .DA POLL + .DA PULSEA + .DA SET.IPCFG .DA GET.IPCFG - .DA $ffff NEW.ICMP.FRAME - .DA $ffff NEW.TCP.FRAME - .DA $ffff NEW.UDP.FRAME - .DA $ffff NEW.IP.FRAME - .DA $ffff NEW.ARP.FRAME - .DA $ffff NEW.ETH.FRAME - - .DA $ffff SEND.ICMP.FRAME - .DA $ffff SEND.TCP.FRAME - .DA $ffff SEND.UDP.FRAME - .DA $ffff SEND.IP.FRAME - .DA $ffff SEND.ARP.FRAME - .DA $ffff SEND.ETH.FRAME - .DA ARP.CLEAR .DA ARP.QUERY .DA ARP.ADD @@ -79,22 +68,24 @@ CS.START cld .DA DNS.ADD .DA DNS.GETCACHE - .DA POLL - .DA PULSEA - + .DA HST.GETBYNAME + .DA HST.GETBYADDR + .DA SKT.NEW - .DA $FFFF - .DA SKT.ACCEPTA - .DA $FFFF - .DA SKT.SEND - .DA SKT.RCVDA - .DA $FFFF .DA SKT.CLOSEA .DA SKT.GETTABLE .DA SKT.GETA + + .DA SKT.ACCEPTA + .DA $FFFF - .DA HST.GETBYNAME - .DA HST.GETBYADDR + .DA SKT.Write + .DA SKT.Read + .DA SKT.ReadA + .DA SKT.PutC + .DA SKT.PutS + .DA SKT.GetCA + .DA SKT.GetS *-------------------------------------- L.IPCFG .DA IPCFG L.ARP.REQ .DA ARP.REQ @@ -331,6 +322,7 @@ TmpSocket .BS S.SOCKET hFrameIn .BS 1 hFrameOut .BS 1 hSocket .BS 1 +bTextMode .BS 1 TmpOffset .BS 2 HST.DecStr .BS 4 HST.IP .BS 5 diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt index 833a7484..b8b06a56 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -122,7 +122,7 @@ CS.RUN.SDISC ldy #hSocket >PUSHB (pData),y >PUSHW L.DHCP.DISC >PUSHWI DHCP.DISC.LEN - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcc .1 jmp CS.RUN.KO @@ -159,7 +159,7 @@ CS.RUN.SREQ ldx #3 >PUSHB (pData),y >PUSHW L.DHCP.REQ >PUSHWI DHCP.REQ.LEN - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcs CS.RUN.KO lda #S.IPCFG.STATUS.SREQ @@ -211,7 +211,7 @@ CS.RUN.KO pha *-------------------------------------- CS.RUN.SKT.RCVD ldy #hSocket lda (pData),y - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ReadA bcs .9 ldy #hFrame sta (pData),y diff --git a/SBIN/HTTPD.S.txt b/SBIN/HTTPD.S.txt index 58416543..ed549255 100644 --- a/SBIN/HTTPD.S.txt +++ b/SBIN/HTTPD.S.txt @@ -13,6 +13,7 @@ AUTO 6 .INB /A2OSX.DEV/INC/LIBTCPIP.I *-------------------------------------- TIMEOUT.MAX .EQ 30 30 sec. +CONN.MAX .EQ 16 *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPSktPtr .EQ ZPBIN+2 @@ -94,23 +95,38 @@ CS.RUN.INIT ldx #3 >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW bcs .9 txa - ldy #hSocket + ldy #hSrvSocket sta (pData),y >LDYA L.MSG.INITOK >SYSCALL CPrintFYA .11 >SYSCALL Sleep - >SYSCALL GetC - bcs .12 - cmp #03 - beq CS.RUN.ABORT -.12 ldy #hSocket +.12 ldy #hSrvSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ACCEPTA - bcs .11 + bcs .15 + + pha + + ldy #hSockets + ldx #CONN.MAX + +.13 lda (pData),y + beq .14 + iny + dex + bne .13 + + pla + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA + bra .15 + +.14 pla + sta (pData),y + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GETA >STYA ZPSktPtr @@ -124,6 +140,25 @@ CS.RUN.INIT ldx #3 >LDYA L.MSG.INCOMING >SYSCALL CPrintFYA + +.15 ldy #SktIndex + lda (pData),y + tay + lda (pData),y hSockets + + beq .16 + + jsr CS.RUN.CLIENT + +.16 ldy #SktIndex + lda (pData),y + inc + cmp #CONN.MAX + bne .17 + lda #0 + +.17 sta (pData),y + bra .11 .9 >LDYA L.MSG.SKTERR @@ -138,10 +173,38 @@ CS.RUN.ABORT >LDYA L.MSG.ABORT sec rts *-------------------------------------- +CS.RUN.CLIENT >PUSHA hSocket + >PUSHWI UsrBuf256 + >PUSHWI 256 + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GetS + bcc .1 + + + + +.1 clc + rts +*-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- -CS.QUIT ldy #hSocket +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 @@ -159,9 +222,6 @@ Wait.TimeOut sec ldy #TimeOut lda (pData),y beq .9 - ldy #bCTRLC - lda (pData),y - bmi .9 clc .9 rts *-------------------------------------- @@ -176,22 +236,22 @@ MSG.ABORT >CSTR "HTTPD:User Aborted\n" MSG.INCOMING >CSTR "HTTPD:Incoming Connection From : %d.%d.%d.%d\n" hLIBTCPIP .BS 1 *-------------------------------------- -Socket .DA #S.SOCKET.SOCK.STREAM+S.SOCKET.STATUS.LISTEN +Socket .DA #S.SOCKET.SOCK.STREAM .DA #S.SOCKET.SO.ACCEPTCONN - .DA 0 + .DA #S.SOCKET.TCP.STATUS.LISTEN .BS 1 Socket.Src.Addr .BS 4 Socket.Src.Port .DA 80 Socket.Dst.Addr .BS 4 Socket.Dst.Port .BS 2 - .BS 16 *-------------------------------------- .DUMMY .OR 0 DS.START +hSockets .BS CONN.MAX pData +SktIndex .BS 1 +hSrvSocket .BS 1 TimeOut .BS 1 -bCTRLC .BS 1 -hSocket .BS 1 DS.END .ED *-------------------------------------- diff --git a/SBIN/NFSD.S.txt b/SBIN/NFSD.S.txt index 7f4cee8c..323639e7 100644 --- a/SBIN/NFSD.S.txt +++ b/SBIN/NFSD.S.txt @@ -207,9 +207,10 @@ MSG.ABORT >CSTR "NFSD:User Aborted\n" MSG.INCOMING >CSTR "NFSD:Incoming Connection From : %d.%d.%d.%d\n" hLIBTCPIP .BS 1 *-------------------------------------- -Socket .DA #S.SOCKET.SOCK.DGRAM+S.SOCKET.STATUS.LISTEN +Socket .DA #S.SOCKET.SOCK.DGRAM .DA #S.SOCKET.SO.ACCEPTCONN - .BS 2 + .DA #S.SOCKET.TCP.STATUS.LISTEN + .BS 1 Socket.Src.Addr .BS 4 Socket.Src.Port .DA 2049 Socket.Dst.Addr .BS 4