A2osX/LIB/LIBTCPIP.S.SKT.txt

549 lines
9.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
LOMEM $A00
INC 1
AUTO 6
.LIST OFF
*/--------------------------------------
* #SKT.New
* ##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 >LDYA L.SKT.TABLE
>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-1
.7 lda (ZPTmpPtr1),y
sta (ZPTmpPtr3),y
dey
bpl .7
ldx TmpOffset
>LDYA ZPTmpPtr3
clc
rts
.9 lda #ERR.SKT.OOS
sec
rts
*--------------------------------------
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
*--------------------------------------
SKT.Send >PULLB hSocket
pha
>PULLW ZPDataInPtr
>PULLW ZPDataInLen
pla
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
jmp SKT.SEND.TCP
.1 cmp #S.SOCKET.SOCK.RAW
bne .99
jmp SKT.SEND.RAW
.99 sec
.9 rts
*--------------------------------------
SKT.SEND.UDP lda #S.IP.PROTOCOL.UDP
jsr FRM.NewA
bcs .9
>LDAXI S.UDP-2
jsr SKT.SetFrameOutLenAX
>LDAXI S.UDP
jsr SKT.SetDataOutPtrAX
jsr SKT.SetFrameOutDstIP
jsr SKT.SetFrameOutPorts
jsr SKT.CopyDataInToOut
jmp FRM.SendUDP
.9 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.SEND.RAW ldy #S.SOCKET.RAW.PROTO
lda (ZPPtrSKT),y
jsr FRM.NewA
bcs .9
>LDAXI S.IP-2
jsr SKT.SetFrameOutLenAX
>LDAXI S.IP
jsr SKT.SetDataOutPtrAX
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.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.Read (STREAM)
* ##In :
* A = hSocket
* ##Out :
* A = hFrame
*\--------------------------------------
SKT.Read
*--------------------------------------
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 cmp #K.SKTTABLE.SIZE
bcs SKT.GetA.9
jsr SKT.GetA.I
bcs SKT.GetA.9
>LDYA ZPPtrSKT
rts
SKT.GetA.I stz ZPPtrSKT
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 SKT.GetA.9
rts CC
SKT.GetA.9 lda #ERR.SKT.BAD
sec
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.GETTABLE >LDYA L.SKT.TABLE
clc
rts
*--------------------------------------
SKT.AddToQueueS
clc
rts
.9 sec
rts
*--------------------------------------
SKT.SetFrameOutLenAX
clc
adc ZPDataInLen
sta (ZPFrameOutPtr)
sta ZPFrameOutLen
txa
adc ZPDataInLen+1
ldy #1
sta (ZPFrameOutPtr),y
sta ZPFrameOutLen+1
rts
*--------------------------------------
SKT.SetDataOutPtrAX
clc
adc ZPFrameOutPtr
sta ZPDataOutPtr
txa
adc ZPFrameOutPtr+1
sta ZPDataOutPtr+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
*--------------------------------------
SKT.CopyDataInToOut
lda ZPDataInLen
eor #$ff
sta ZPDataInLen
lda ZPDataInLen+1
eor #$ff
tax
ldy #0
.1 inc ZPDataInLen
bne .2
inx
beq .9
.2 lda (ZPDataInPtr),y
sta (ZPDataOutPtr),y
iny
bne .1
inc ZPDataInPtr+1
inc ZPDataOutPtr+1
bne .1
.9 rts
MAN
SAVE LIB/LIBTCPIP.S.SKT
LOAD LIB/LIBTCPIP.S
ASM