A2osX/LIB/LIBTCPIP.S.SKT.txt
2017-02-13 08:26:18 +01:00

809 lines
14 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
* 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