PR#3 PREFIX /A2OSX.SRC LOMEM $A00 INC 1 AUTO 6 .LIST OFF */-------------------------------------- * #SKT.New * Create a new socket * ##In : * PUSHW = PTR to S.SOCKET template * ##Out : * YA = PTR to new S.SOCKET * X = hSocket *\-------------------------------------- SKT.New >PULLW 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 lda hSocketTable >SYSCALL GetMemPtrA >STYA ZPTmpPtr2 lda #$ff sta TmpOffset to keep track of any free slot ldx #0 .2 lda (ZPTmpPtr2) beq .4 empty!!! cmp (ZPTmpPtr1) bne .5 not same SKT type...try next 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.SKT.BUSY same one!!!!! busy... sec rts .4 lda TmpOffset bpl .5 already found an empty slot.... >LDYA ZPTmpPtr2 found one... >STYA ZPTmpPtr3 save it! stx TmpOffset .5 lda ZPTmpPtr2 clc adc #S.SOCKET sta ZPTmpPtr2 bcc .6 inc ZPTmpPtr2+1 .6 inx cpx #K.SKTTABLE.SIZE bne .2 lda TmpOffset Did we found an empty slot ? bmi .9 ldy #S.SOCKET.TEMPLATE-1 .7 lda (ZPTmpPtr1),y sta (ZPTmpPtr3),y dey bpl .7 lda (ZPTmpPtr1) and #S.SOCKET.SOCK.MASK cmp #S.SOCKET.SOCK.STREAM bne .8 ldy #S.SOCKET.SO lda (ZPTmpPtr1),y and #S.SOCKET.SO.ACCEPTCONN bne .8 jsr SKT.New.TCP bcs .99 .8 ldx TmpOffset >LDYA ZPTmpPtr3 clc rts .9 lda #ERR.SKT.OOS sec .99 rts *-------------------------------------- SKT.New.TCP ldy #S.SOCKET.SQ.INFREE lda #K.TCP.WSIZE sta (ZPTmpPtr3),y iny lda /K.TCP.WSIZE sta (ZPTmpPtr3),y ldy #S.SOCKET.SQ.OUTFREE lda #K.TCP.WSIZE sta (ZPTmpPtr3),y iny lda /K.TCP.WSIZE sta (ZPTmpPtr3),y lda #0 ldy #S.SOCKET.SQ.INUSED sta (ZPTmpPtr3),y iny sta (ZPTmpPtr3),y ldy #S.SOCKET.SQ.OUTUSED sta (ZPTmpPtr3),y iny sta (ZPTmpPtr3),y >PUSHW K.TCP.WSIZE >PUSHBI 0 >SYSCALL GetMem bcs .9 txa ldy #S.SOCKET.STREAM.hInMem sta (ZPTmpPtr3),y >PUSHW K.TCP.WSIZE >PUSHBI 0 >SYSCALL GetMem bcs .9 txa ldy #S.SOCKET.STREAM.hOutMem sta (ZPTmpPtr3),y 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 : * A = hSocket * ##Out : *\-------------------------------------- SKT.CloseA cmp #K.SKTTABLE.SIZE bcs SKT.GetA.9 jsr SKT.GetA.I bcs .9 and #S.SOCKET.SOCK.MASK cmp #S.SOCKET.SOCK.DGRAM beq .8 cmp #S.SOCKET.SOCK.RAW beq .8 ldy #S.SOCKET.SO lda (ZPPtrSKT),y bit #S.SOCKET.SO.ACCEPTCONN beq * .8 lda #0 sta (ZPPtrSKT) clc .9 rts */-------------------------------------- * #SKT.GetA * Get Ptr to socket * ##In : * A = hSocket * ##Out : * Y,A = pS.SOCKET *\-------------------------------------- SKT.GetA cmp #K.SKTTABLE.SIZE bcs SKT.GetA.9 jsr SKT.GetA.I bcs SKT.GetA.9 >LDYA ZPPtrSKT rts SKT.GetA.I pha lda hSocketTable >SYSCALL GetMemPtrA >STYA ZPPtrSKT plx beq .8 .1 lda ZPPtrSKT clc adc #S.SOCKET sta ZPPtrSKT bcc .2 inc ZPPtrSKT+1 .2 dex bne .1 .8 lda (ZPPtrSKT) beq SKT.GetA.9 clc rts SKT.GetA.9 lda #ERR.SKT.BAD sec rts */-------------------------------------- * #SKT.GetTable * Get socket table * ##In : * ##Out : * Y,A = pS.SOCKET *\-------------------------------------- SKT.GetTable lda hSocketTable >SYSCALL GetMemPtrA clc rts *-------------------------------------- * ZPPtrSKT -> actual socket * A = hSocket or hFrame *-------------------------------------- SKT.AddToQueueA sta .2+1 ldy #S.SOCKET.HQ.HEAD lda (ZPPtrSKT),y tax inc cmp #S.SOCKET.HQ.MAX bne .1 lda #0 .1 ldy #S.SOCKET.HQ.TAIL cmp (ZPPtrSKT),y beq .9 Queue full!! ldy #S.SOCKET.HQ.HEAD sta (ZPPtrSKT),y txa clc adc #S.SOCKET.HQ tay .2 lda #$ff sta (ZPPtrSKT),y clc rts .9 sec rts *-------------------------------------- SKT.AddToQueueS clc rts .9 sec rts *-------------------------------------- SKT.GetCopy ldy #S.SOCKET-1 .1 lda (ZPPtrSKT),y sta SKT.TmpCache dey bpl .1 rts *-------------------------------------- SKT.PutCopy ldy #S.SOCKET-1 .1 lda SKT.TmpCache sta (ZPPtrSKT),y dey bpl .1 rts *-------------------------------------- SKT.SetFrameOutDstIP 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 (ZPFrameOutPtr),y dey dex bne .2 rts *-------------------------------------- SKT.SetFrameOutPorts 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 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 rts *-------------------------------------- SKT.CopyDataInToOut lda ZPDataInPtr+1 pha lda ZPDataOutPtr+1 pha lda ZPDataInLen eor #$ff tax lda ZPDataInLen+1 eor #$ff pha ldy #0 .1 inx bne .2 pla inc beq .9 pha .2 lda (ZPDataInPtr),y sta (ZPDataOutPtr),y iny bne .1 inc ZPDataInPtr+1 inc ZPDataOutPtr+1 bne .1 .9 pla sta ZPDataOutPtr+1 pla sta ZPDataInPtr+1 rts *-------------------------------------- MAN SAVE LIB/LIBTCPIP.S.SKT LOAD LIB/LIBTCPIP.S ASM