A2osX/LIB/LIBTCPIP.S.SKT.txt

809 lines
14 KiB
Plaintext
Raw Normal View History

PR#3
PREFIX /A2OSX.SRC
LOMEM $A00
INC 1
AUTO 6
.LIST OFF
*/--------------------------------------
* #SKT.New
2017-02-13 07:26:18 +00:00
* 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
2017-02-10 07:29:58 +00:00
.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
2017-02-13 07:26:18 +00:00
ldy #S.SOCKET.TEMPLATE-1
.7 lda (ZPTmpPtr1),y
sta (ZPTmpPtr3),y
dey
bpl .7
2017-02-10 07:29:58 +00:00
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
2017-02-10 07:29:58 +00:00
.99 rts
*--------------------------------------
2017-02-10 07:29:58 +00:00
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
2017-02-13 07:26:18 +00:00
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
2017-02-10 07:29:58 +00:00
>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
2017-02-13 07:26:18 +00:00
*/--------------------------------------
* #SKT.AcceptA
* Check for an incoming connection
* ##In :
* A = hListeningSocket
* ##Out :
* A = hSocket
*\--------------------------------------
2017-02-10 07:29:58 +00:00
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
2017-02-13 07:26:18 +00:00
pha
inc
cmp #S.SOCKET.HQ.MAX
bne .1
2017-02-13 07:26:18 +00:00
lda #0
2017-02-13 07:26:18 +00:00
.1 sta (ZPPtrSKT),y
pla
clc
adc #S.SOCKET.HQ
tay
lda (ZPPtrSKT),y
clc
rts
.99 lda #ERR.SKT.BAD
sec
.9 rts
2017-02-13 07:26:18 +00:00
*/--------------------------------------
* #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
2017-02-13 07:26:18 +00:00
jsr SKT.GetA.I
bcs .9
2017-02-13 07:26:18 +00:00
and #S.SOCKET.SOCK.MASK
cmp #S.SOCKET.SOCK.DGRAM
beq SKT.SEND.UDP
2017-02-13 07:26:18 +00:00
cmp #S.SOCKET.SOCK.STREAM
bne .1
2017-02-13 07:26:18 +00:00
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
2017-02-13 07:26:18 +00:00
.99 lda #ERR.SKT.BAD
sec
.9 rts
*--------------------------------------
2017-02-13 07:26:18 +00:00
SKT.SEND.UDP ldx #S.IP.PROTOCOL.UDP
>LDYA ZPDataInLen
jsr FRM.NewIP
bcs .9
jsr SKT.SetFrameOutDstIP
jsr SKT.SetFrameOutPorts
2017-02-13 07:26:18 +00:00
jsr SKT.CopyDataInToOut
jmp FRM.SendUDP
.9 rts
*--------------------------------------
2017-02-13 07:26:18 +00:00
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
*\--------------------------------------
2017-02-10 07:29:58 +00:00
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
2017-02-10 07:29:58 +00:00
* ##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
2017-02-10 07:29:58 +00:00
* ##Out :
* Y,A = bytes read
*\--------------------------------------
SKT.GetS sec
.HS 90 bcc
2017-02-10 07:29:58 +00:00
*/--------------------------------------
* #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
2017-02-13 07:26:18 +00:00
*/--------------------------------------
* #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
2017-02-13 07:26:18 +00:00
*/--------------------------------------
* #SKT.GetA
* Get Ptr to socket
* ##In :
* A = hSocket
* ##Out :
* Y,A = pS.SOCKET
*\--------------------------------------
SKT.GetA cmp #K.SKTTABLE.SIZE
bcs SKT.GetA.9
2017-02-10 07:29:58 +00:00
jsr SKT.GetA.I
2017-02-10 07:29:58 +00:00
bcs SKT.GetA.9
2017-02-10 07:29:58 +00:00
>LDYA ZPPtrSKT
rts
2017-02-10 07:29:58 +00:00
SKT.GetA.I pha
lda hSocketTable
>SYSCALL GetMemPtrA
>STYA ZPPtrSKT
2017-02-10 07:29:58 +00:00
plx
beq .8
2017-02-10 07:29:58 +00:00
.1 lda ZPPtrSKT
clc
adc #S.SOCKET
sta ZPPtrSKT
2017-02-10 07:29:58 +00:00
bcc .2
inc ZPPtrSKT+1
.2 dex
bne .1
2017-02-13 07:26:18 +00:00
.8 lda (ZPPtrSKT)
beq SKT.GetA.9
2017-02-13 07:26:18 +00:00
clc
rts
SKT.GetA.9 lda #ERR.SKT.BAD
sec
rts
2017-02-13 07:26:18 +00:00
*/--------------------------------------
* #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
2017-02-13 07:26:18 +00:00
rts
*--------------------------------------
SKT.CopyDataInToOut
2017-02-13 07:26:18 +00:00
lda ZPDataInPtr+1
pha
lda ZPDataOutPtr+1
pha
lda ZPDataInLen
eor #$ff
2017-02-13 07:26:18 +00:00
tax
lda ZPDataInLen+1
eor #$ff
2017-02-13 07:26:18 +00:00
pha
ldy #0
2017-02-13 07:26:18 +00:00
.1 inx
bne .2
2017-02-13 07:26:18 +00:00
pla
inc
beq .9
2017-02-13 07:26:18 +00:00
pha
.2 lda (ZPDataInPtr),y
sta (ZPDataOutPtr),y
iny
bne .1
inc ZPDataInPtr+1
inc ZPDataOutPtr+1
bne .1
2017-02-13 07:26:18 +00:00
.9 pla
sta ZPDataOutPtr+1
pla
sta ZPDataInPtr+1
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.SKT
LOAD LIB/LIBTCPIP.S
ASM