PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * IN : PULLW = PTR to S.SOCKET template * OUT : * YA=PTR to new S.SOCKET * X hSocket 128PULLW ZPTmpPtr1 ldy #S.SOCKET.SRC.PORT+1 lda (ZPTmpPtr1),y dey ora (ZPTmpPtr1),y bne .1 jsr GetDynPort sta (ZPTmpPtr1),y txa iny sta (ZPTmpPtr1),y .1 >LDYA L.SKT.TABLE >STYA ZPTmpPtr2 stz TmpOffset to keep track of any free slot ldx #0 .2 lda (ZPTmpPtr2) beq .4 cmp (ZPTmpPtr1) bne .5 ldy #S.SOCKET.SRC.ADDR .3 lda (ZPTmpPtr1),y cmp (ZPTmpPtr2),y bne .5 iny cpy #S.SOCKET.DST.PORT+2 bne .3 lda ERR.SBUSY sec rts .4 bit TmpOffset bmi .5 Already found an empty slot >LDYA ZPTmpPtr2 >STYA ZPTmpPtr3 txa ora #$80 sta TmpOffset .5 lda ZPTmpPtr2 clc adc #S.SOCKET sta ZPTmpPtr2 bcc .6 inc ZPTmpPtr2+1 .6 inx cpx #K.SKTTABLE.SIZE bne .2 bit TmpOffset Did we found an empty slot ? bpl .9 ldy #S.SOCKET-1 .7 lda (ZPTmpPtr1),y sta (ZPTmpPtr3),y dey bpl .7 ldx TmpOffset >LDYA ZPTmpPtr3 clc rts .9 lda #ERR.OOS sec rts *-------------------------------------- SKT.ACCEPTA jsr SKT.GetA bcs .9 ldy #S.SOCKET.SO lda (ZPPtrSKT),y and #S.SOCKET.SO.ACCEPTCONN bne .99 ldy #S.SOCKET.LQ.HEAD lda (ZPPtrSKT),y ldy #S.SOCKET.LQ.TAIL cmp (ZPPtrSKT),y Queue Empty beq .9 CC pha inc cmp #S.SOCKET.LQ.MAX bne .1 lda #0 .1 sta (ZPPtrSKT),y pla clc adc #S.SOCKET.LQ tay lda (ZPPtrSKT),y clc rts .99 lda #ERR.SBAD sec .9 rts *-------------------------------------- SKT.SENDA sec rts *-------------------------------------- SKT.SEND >PULLB hSocket pha >PULLW ZPDataPtr >PULLW ZPDataLen pla jsr SKT.GetA bcs .9 cpx #S.SOCKET.SOCK.DGRAM beq SKT.SEND.UDP cpx #S.SOCKET.SOCK.STREAM bne .99 jmp SKT.SEND.TCP .99 sec .9 rts *-------------------------------------- SKT.SEND.UDP jsr NEW.UDP.FRAME bcs .9 stx hFrame1 lda #S.UDP-2 clc adc ZPDataLen sta (ZPFrameBase1) sta ZPFrameLen1 lda /S.UDP-2 adc ZPDataLen+1 ldy #1 sta (ZPFrameBase1),y sta ZPFrameLen1+1 ldy #S.SOCKET.SRC.PORT lda (ZPPtrSKT),y tax iny lda (ZPPtrSKT),y ldy #S.UDP.SRCPORT sta (ZPFrameBase1),y iny txa sta (ZPFrameBase1),y ldy #S.SOCKET.DST.ADDR ldx #4 .1 lda (ZPPtrSKT),y pha iny dex bne .1 ldy #S.IP.DST+3 ldx #4 .2 pla sta (ZPFrameBase1),y dey dex bne .2 ldy #S.SOCKET.DST.PORT lda (ZPPtrSKT),y tax iny lda (ZPPtrSKT),y ldy #S.UDP.DSTPORT sta (ZPFrameBase1),y iny txa sta (ZPFrameBase1),y lda #S.UDP clc adc ZPFrameBase1 sta ZPFramePtr1 lda /S.UDP adc ZPFrameBase1+1 sta ZPFramePtr1+1 ldy #0 .3 jsr DecDataLen beq .4 lda (ZPDataPtr),y sta (ZPFramePtr1),y iny bne .3 inc ZPDataPtr inc ZPFramePtr1 bra .3 .4 jsr SEND.UDP.FRAME.I bcc .9 lda hFrame1 >SYSCALL SYS.FreeMemA sec .9 rts *-------------------------------------- SKT.SEND.TCP bra * sec rts *-------------------------------------- SKT.RCVDA jsr SKT.GetA bcs .9 ldy #S.SOCKET.DQ.TAIL lda (ZPPtrSKT),y ldy #S.SOCKET.DQ.HEAD cmp (ZPPtrSKT),y beq .99 pha inc cmp #S.SOCKET.DQ.MAX bne .1 lda #0 .1 sta (ZPPtrSKT),y pla clc adc #S.SOCKET.DQ tay lda (ZPPtrSKT),y clc rts .99 sec .9 rts *-------------------------------------- SKT.CLOSEA jsr SKT.GetA bcs .9 cpx #S.SOCKET.SOCK.DGRAM beq .8 ldy #S.SOCKET.SO lda (ZPPtrSKT),y bit #S.SOCKET.SO.ACCEPTCONN beq * .8 lda #0 sta (ZPPtrSKT) clc .9 rts *-------------------------------------- SKT.GETTABLE >LDYA L.SKT.TABLE clc rts *-------------------------------------- SKT.GetA stz ZPPtrSKT and #$7f Strip off msb lsr ror ZPPtrSKT lsr ror ZPPtrSKT lsr ror ZPPtrSKT pha lda ZPPtrSKT adc L.SKT.TABLE sta ZPPtrSKT pla adc L.SKT.TABLE+1 sta ZPPtrSKT+1 lda (ZPPtrSKT) beq .9 tax >LDYA ZPPtrSKT rts CC .9 lda #ERR.SBAD sec rts *-------------------------------------- * ZPPtrSKT -> actual socket * A = hSocket *-------------------------------------- SKT.AddToQueueL pha ldy #S.SOCKET.LQ.HEAD lda (ZPPtrSKT),y tax inc cmp #S.SOCKET.LQ.MAX bne .1 lda #0 .1 ldy #S.SOCKET.LQ.TAIL cmp (ZPPtrSKT),y beq .9 Queue full!! ldy #S.SOCKET.LQ.HEAD sta (ZPPtrSKT),y txa clc adc #S.SOCKET.LQ tay pla sta (ZPPtrSKT),y clc rts .9 pla sec rts *-------------------------------------- SKT.AddToQueueD ldy #S.SOCKET.DQ.HEAD lda (ZPPtrSKT),y tax inc cmp #S.SOCKET.DQ.MAX bne .1 lda #0 .1 ldy #S.SOCKET.DQ.TAIL cmp (ZPPtrSKT),y beq .9 Queue full!! ldy #S.SOCKET.DQ.HEAD sta (ZPPtrSKT),y txa clc adc #S.SOCKET.DQ tay lda hFrame1 sta (ZPPtrSKT),y clc rts .9 sec rts *-------------------------------------- SKT.AddToQueueS clc rts .9 sec rts *-------------------------------------- SKT.TCPSendSYNACKA jsr SKT.GetA ldy #S.SOCKET.SRC.ADDR+3 ldx #3 .1 lda (ZPPtrSKT),y sta TCP.MSG+S.IP.SRC,x dey dex bpl .1 ldy #S.SOCKET.SRC.PORT lda (ZPPtrSKT),y sta TCP.MSG+S.TCP.SRCPORT+1 iny lda (ZPPtrSKT),y sta TCP.MSG+S.TCP.SRCPORT ldy #S.SOCKET.DST.ADDR+3 ldx #3 .2 lda (ZPPtrSKT),y sta TCP.MSG+S.IP.DST,x dey dex bpl .2 ldy #S.SOCKET.DST.PORT lda (ZPPtrSKT),y sta TCP.MSG+S.TCP.DSTPORT+1 iny lda (ZPPtrSKT),y sta TCP.MSG+S.TCP.DSTPORT ldy #S.SOCKET.SQ.SEQNUM+7 ldx #7 .3 lda (ZPPtrSKT),y sta TCP.MSG+S.TCP.SEQ.NUMBER,x dey dex bpl .3 lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK sta TCP.MSG+S.TCP.OPTIONS >PUSHW L.TCP.MSG jsr SEND.TCP.FRAME clc rts *-------------------------------------- MAN SAVE LIB/LIBTCPIP.S.SKT LOAD LIB/LIBTCPIP.S ASM