A2osX/LIB/LIBTCPIP.S.SKT.txt

390 lines
6.3 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
*--------------------------------------
* IN : PULLW = 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
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.SKT.BUSY
sec
rts
.4 bit TmpOffset
bmi .5 Already found an empty slot
>LDYA ZPTmpPtr2
>STYA ZPTmpPtr3
stx 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.SKT.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.SKT.BAD
sec
.9 rts
*--------------------------------------
* SKT.Send
*--------------------------------------
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 .1
jmp SKT.SEND.TCP
.1 cpx #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
stx hFrameOut
lda #S.UDP-2
clc
adc ZPDataLen
sta (ZPFrameBase)
sta ZPFrameLen
lda /S.UDP-2
adc ZPDataLen+1
ldy #1
sta (ZPFrameBase),y
sta ZPFrameLen+1
ldy #S.SOCKET.SRC.PORT
lda (ZPPtrSKT),y
tax
iny
lda (ZPPtrSKT),y
ldy #S.UDP.SRCPORT
sta (ZPFrameBase),y
iny
txa
sta (ZPFrameBase),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 (ZPFrameBase),y
dey
dex
bne .2
ldy #S.SOCKET.DST.PORT
lda (ZPPtrSKT),y
tax
iny
lda (ZPPtrSKT),y
ldy #S.UDP.DSTPORT
sta (ZPFrameBase),y
iny
txa
sta (ZPFrameBase),y
lda #S.UDP
clc
adc ZPFrameBase
sta ZPTmpPtr1
lda /S.UDP
adc ZPFrameBase+1
sta ZPTmpPtr1+1
ldy #0
.3 jsr DecDataLen
beq .4
lda (ZPDataPtr),y
sta (ZPTmpPtr1),y
iny
bne .3
inc ZPDataPtr
inc ZPTmpPtr1
bra .3
.4 jmp FRM.SendUDP
.9 rts
*--------------------------------------
SKT.SEND.TCP
bra *
sec
rts
*--------------------------------------
SKT.SEND.RAW ldy #S.SOCKET.RAW.PROTO
lda (ZPPtrSKT),y
cmp #S.IP.PROTOCOL.ICMP
bne .9
jsr FRM.NewA
bcs .9
stx hFrameOut
jmp FRM.SendIP
.9 sec
rts
*--------------------------------------
SKT.RCVDA jsr SKT.GetA
bcs .9
ldy #S.SOCKET.DQ.TAIL
lda (ZPPtrSKT),y
tax
ldy #S.SOCKET.DQ.HEAD
cmp (ZPPtrSKT),y
beq .99
inc
cmp #S.SOCKET.DQ.MAX
bne .1
lda #0
.1 ldy #S.SOCKET.DQ.TAIL
sta (ZPPtrSKT),y
txa
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.SKT.BAD
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.AddToQueueA sta .2+1
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
.2 lda #$ff
sta (ZPPtrSKT),y
clc
rts
.9 sec
rts
*--------------------------------------
SKT.AddToQueueS
clc
rts
.9 sec
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.SKT
LOAD LIB/LIBTCPIP.S
ASM