A2osX/LIB/LIBTCPIP.S.SKT.txt

1391 lines
26 KiB
Plaintext
Raw Normal View History

2017-12-22 21:24:30 +00:00
NEW
2018-11-17 17:17:13 +00:00
PREFIX
2017-12-22 21:24:30 +00:00
AUTO 4,1
2018-11-06 16:31:13 +00:00
.LIST OFF
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Socket
2018-09-26 15:36:32 +00:00
* Create a new socket
* ## C
2018-09-28 15:24:44 +00:00
* `hFD socket(short int type, short int protocol);`
2018-09-26 15:36:32 +00:00
* ## ASM
* **In:**
2018-09-28 15:24:44 +00:00
* `>PUSHB protocol`
2018-09-26 15:36:32 +00:00
* `lda type`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.socket`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-09-26 15:36:32 +00:00
* CC: A = hSOCKET
* CS: A = EC
*\--------------------------------------
2018-11-06 16:31:13 +00:00
SKT.Socket tax
2018-10-01 15:52:58 +00:00
>PULLA get protocol (RAW)
SKT.Socket.I jmp (J.SKT.Socket,x)
2018-11-01 08:53:47 +00:00
SKT.Socket.RAW ldy #S.SOCKET
2018-10-01 15:52:58 +00:00
bra SKT.Socket.DSOCK
2018-09-28 05:58:24 +00:00
SKT.Socket.DGRAM
2018-09-28 15:24:44 +00:00
lda #S.IP.PROTOCOL.UDP
2018-11-01 08:53:47 +00:00
ldy #S.SOCKET
2018-10-01 15:52:58 +00:00
bra SKT.Socket.DSOCK
2018-09-28 05:58:24 +00:00
SKT.Socket.SEQPACKET
2018-09-28 15:24:44 +00:00
lda #S.IP.PROTOCOL.TCP
2018-11-01 08:53:47 +00:00
ldy #S.SOCKET.TCP
2018-10-01 15:52:58 +00:00
SKT.Socket.DSOCK
stx FD.DSOCK+S.SOCKET.T save type
sta FD.DSOCK+S.SOCKET.PROTO ICMP,UDP,TCP
lda #0 Y = socket.size
2018-09-28 15:24:44 +00:00
>SYSCALL GetMem0
2018-10-08 15:41:00 +00:00
bcs .9
2018-10-01 15:52:58 +00:00
>STYA ZPTmpPtr1
2018-11-01 08:53:47 +00:00
2018-10-01 15:52:58 +00:00
jsr SKT.Socket.FindFree
bcs .9
ldy #FD.DSOCK.SIZE-1
2018-11-01 08:53:47 +00:00
2018-10-01 15:52:58 +00:00
.1 lda FD.DSOCK,y
sta (ZPTmpPtr1),y
dey
bpl .1
2018-11-01 08:53:47 +00:00
2018-10-01 15:52:58 +00:00
txa
clc
.9 rts
SKT.Socket.STREAM
lda #S.IP.PROTOCOL.TCP
ldy #S.SOCKET.TCP
stx FD.SSOCK+S.SOCKET.T save type
2018-11-01 08:53:47 +00:00
sta FD.SSOCK+S.SOCKET.PROTO
2018-10-01 15:52:58 +00:00
lda #0 Y = socket.size
>SYSCALL GetMem0
2018-10-08 15:41:00 +00:00
bcs .9
2018-10-01 15:52:58 +00:00
>STYA ZPTmpPtr1
jsr SKT.Socket.FindFree
bcs .9
2018-11-07 21:48:48 +00:00
2018-10-01 15:52:58 +00:00
ldy #FD.SSOCK.SIZE-1
2018-11-07 21:48:48 +00:00
2018-10-01 15:52:58 +00:00
.1 lda FD.SSOCK,y
sta (ZPTmpPtr1),y
dey
bpl .1
2018-11-07 21:48:48 +00:00
2018-10-01 15:52:58 +00:00
txa
clc
2018-11-06 16:31:13 +00:00
.9 rts
2018-10-01 15:52:58 +00:00
SKT.Socket.FindFree
2018-09-28 15:24:44 +00:00
ldy #0
.1 lda SKT.TABLE,y
beq .2
iny
cpy #K.SKTTABLE.SIZE
bne .1
2018-09-28 05:58:24 +00:00
2018-09-28 15:24:44 +00:00
txa
>SYSCALL freemem
2018-10-21 20:54:07 +00:00
lda #E.OOH
2018-09-28 15:24:44 +00:00
sec
2018-10-01 15:52:58 +00:00
rts
2018-09-28 15:24:44 +00:00
2018-11-07 21:48:48 +00:00
.2 txa
2018-09-28 15:24:44 +00:00
sta SKT.TABLE,y
clc
rts
2018-09-26 15:36:32 +00:00
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Bind
2018-09-28 15:24:44 +00:00
* bind a name to a socket
2018-09-26 15:36:32 +00:00
* ## C
* `int bind(hFD fd, const struct sockaddr *addr);`
* ## ASM
* **In:**
* `>PUSHW addr`
* `lda fd`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.socket`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-09-26 15:36:32 +00:00
* CC: A = hSOCKET
* CS: A = EC
*\--------------------------------------
2018-09-28 15:24:44 +00:00
SKT.bind >SYSCALL GetMemPtr
>STYA ZPPtrSKT
2018-10-01 15:52:58 +00:00
jsr SKT.PullLocAddr
2018-11-01 08:53:47 +00:00
2018-10-01 05:48:42 +00:00
lda SKT.LOC.ADDR+S.SOCKADDR.PORT
bne .1
2018-10-10 15:39:22 +00:00
ldx SKT.LOC.ADDR+S.SOCKADDR.PORT+1
2018-10-01 05:48:42 +00:00
bne .1
2018-11-01 08:53:47 +00:00
2018-10-01 05:48:42 +00:00
jsr GetDynPort
2018-11-01 08:53:47 +00:00
2018-10-10 15:39:22 +00:00
sta SKT.LOC.ADDR+S.SOCKADDR.PORT
stx SKT.LOC.ADDR+S.SOCKADDR.PORT+1
2018-11-01 08:53:47 +00:00
2018-11-09 13:29:23 +00:00
.1 ldx #0
2018-11-01 08:53:47 +00:00
2018-11-09 13:29:23 +00:00
.2 lda SKT.TABLE,x
beq .7
2018-10-09 15:47:06 +00:00
2018-11-09 13:29:23 +00:00
phx
>SYSCALL GetMemPtr
>STYA ZPTmpPtr1
plx
ldy #S.SOCKET.AF
lda (ZPTmpPtr1),y
cmp #AF.INET
bne .7
ldy #S.SOCKET.LOC.ADDR
.3 lda (ZPTmpPtr1),y
cmp SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y
bne .7
iny
cpy #S.SOCKET.LOC.PORT+2
bne .3
lda #ERR.SKT.BUSY
* sec
2018-09-28 15:24:44 +00:00
rts
2018-11-09 13:29:23 +00:00
.7 inx
cpx #K.SKTTABLE.SIZE
bne .2
jmp SKT.SetLocAddr
2018-09-26 15:36:32 +00:00
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Connect
2018-11-01 08:53:47 +00:00
* Initiate a connection on a socket
2018-09-26 15:36:32 +00:00
* ## C
* `int connect(hFD fd, const struct sockaddr *addr);`
* ## ASM
* **In:**
* `>PUSHW addr`
* `lda fd`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.socket`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-09-26 15:36:32 +00:00
* CC: A = hSOCKET
* CS: A = EC
*\--------------------------------------
2018-09-27 15:34:38 +00:00
SKT.connect >SYSCALL GetMemPtr
>STYA ZPPtrSKT
2018-10-09 15:47:06 +00:00
2018-10-01 15:52:58 +00:00
jsr SKT.PullRemAddr
2018-11-07 21:48:48 +00:00
2018-09-28 15:24:44 +00:00
ldy #S.SOCKET.T
2018-10-01 05:48:42 +00:00
lda (ZPPtrSKT),y
2018-09-27 15:34:38 +00:00
tax
jmp (J.SKT.connect,x)
SKT.connect.RAW
SKT.connect.DGRAM
2018-11-06 16:31:13 +00:00
jmp SKT.SetRemAddr
2018-10-01 05:48:42 +00:00
SKT.connect.STREAM
SKT.connect.SEQPACKET
jsr SKT.SetRemAddr
2018-11-01 08:53:47 +00:00
jsr SKT.NewTCB
2018-11-11 22:05:04 +00:00
bcs .99
2018-10-01 05:48:42 +00:00
lda #S.TCP.OPTIONS.SYN
jsr TCP.OUT.SendOptA Send SYN
bcs .9
2018-10-01 05:48:42 +00:00
lda #S.SOCKET.TCP.S.SYNSENT
2018-11-11 22:05:04 +00:00
jmp SKT.StoreTCB.S
2018-10-01 05:48:42 +00:00
2018-11-01 08:53:47 +00:00
.9 lda #ERR.SKT.BAD
2018-10-01 05:48:42 +00:00
sec
2018-11-11 22:05:04 +00:00
.99 rts
2018-10-01 05:48:42 +00:00
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Listen
2018-10-01 05:48:42 +00:00
* Listen for connections on a socket
* ## C
* `int listen(hFD fd);`
* ## ASM
* **In:**
* `lda fd`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.listen`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-10-01 05:48:42 +00:00
* CS: A = EC
*\--------------------------------------
SKT.listen >SYSCALL GetMemPtr
>STYA ZPPtrSKT
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.T
lda (ZPPtrSKT),y
2018-10-01 15:52:58 +00:00
cmp #S.SOCKET.T.SEQPACKET+1
2018-10-01 05:48:42 +00:00
bcc .9
ldy #S.SOCKET.TCP.S
lda (ZPPtrSKT),y
bne .9
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
lda #S.SOCKET.TCP.S.LISTEN
sta (ZPPtrSKT),y
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.O
lda #S.SOCKET.O.ACCEPTCONN
2018-08-29 15:01:02 +00:00
sta (ZPPtrSKT),y
2018-09-27 06:00:22 +00:00
2018-10-01 05:48:42 +00:00
clc
rts
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
.9 lda #ERR.SKT.BAD
sec
2018-11-06 16:31:13 +00:00
rts
2018-10-01 05:48:42 +00:00
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Accept
2018-10-01 05:48:42 +00:00
* Accept a connection on a socket
* ## C
* `hFD Accept(hFD fd);`
* ## ASM
* **In:**
* `lda fd`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.accept`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-10-01 05:48:42 +00:00
* A = hSocket
*\--------------------------------------
SKT.Accept >SYSCALL GetMemPtr
>STYA ZPPtrSKT
2018-10-09 15:47:06 +00:00
2018-09-28 15:24:44 +00:00
ldy #S.SOCKET.O
2018-09-25 15:31:35 +00:00
lda (ZPPtrSKT),y
2018-09-28 15:24:44 +00:00
and #S.SOCKET.O.ACCEPTCONN
2018-10-01 05:48:42 +00:00
beq .99
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.HQ.TAIL
2018-09-27 06:00:22 +00:00
lda (ZPPtrSKT),y
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.HQ.HEAD
2018-11-07 21:48:48 +00:00
cmp (ZPPtrSKT),y
2018-10-01 05:48:42 +00:00
beq .9 CS
2018-10-09 15:47:06 +00:00
2018-11-07 21:48:48 +00:00
pha
2018-10-01 05:48:42 +00:00
inc
cmp #S.SOCKET.HQ.MAX
bne .1
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
lda #0
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
.1 ldy #S.SOCKET.HQ.TAIL
sta (ZPPtrSKT),y
pla
clc
adc #S.SOCKET.HQ
tay
lda (ZPPtrSKT),y
clc
rts
2018-10-09 15:47:06 +00:00
2018-10-01 05:48:42 +00:00
.99 lda #ERR.SKT.BAD
sec
2018-10-01 05:48:42 +00:00
.9 rts
2017-02-13 07:26:18 +00:00
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Shutdown
2018-10-01 05:48:42 +00:00
* Close socket
* ## C
2018-10-10 15:39:22 +00:00
* `int shutdown(int fd);`
2018-10-01 05:48:42 +00:00
* ## ASM
* **In:**
* `lda fd`
2018-10-10 15:39:22 +00:00
* `>LIBCALL hLIBTCPIP,LIBTCPIP.shutdown`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
*\--------------------------------------
2018-11-06 16:31:13 +00:00
SKT.shutdown pha
>SYSCALL GetMemPtr
2018-10-01 05:48:42 +00:00
>STYA ZPPtrSKT
2018-10-09 15:47:06 +00:00
2018-11-06 16:31:13 +00:00
ldy #S.SOCKET.O
2018-11-06 07:09:44 +00:00
lda (ZPPtrSKT),y
2018-11-06 16:31:13 +00:00
and #S.SOCKET.O.ACCEPTCONN
bne SKT.shutdown.LISTEN
2018-11-07 21:48:48 +00:00
2018-11-06 16:31:13 +00:00
ldy #S.SOCKET.T
lda (ZPPtrSKT),y
tax
jmp (J.SKT.shutdown,x)
SKT.shutdown.LISTEN
SKT.shutdown.RAW
SKT.shutdown.DGRAM
SKT.shutdown.SEQPACKET
.1 ldy #S.SOCKET.HQ.TAIL
lda (ZPPtrSKT),y
ldy #S.SOCKET.HQ.HEAD
cmp (ZPPtrSKT),y
2018-11-06 16:31:13 +00:00
beq .3 No frame in Queue, close..
2018-10-09 15:47:06 +00:00
2018-06-18 06:22:50 +00:00
pha save tail...
clc
adc #S.SOCKET.HQ
tax
pla
inc
cmp #S.SOCKET.HQ.MAX
beq .2
2018-10-09 15:47:06 +00:00
lda #0
2018-10-09 15:47:06 +00:00
2018-06-18 06:22:50 +00:00
.2 ldy #S.SOCKET.HQ.TAIL
sta (ZPPtrSKT),y
2018-10-09 15:47:06 +00:00
txa
tay
lda (ZPPtrSKT),y
2018-07-18 15:30:42 +00:00
>SYSCALL FreeMem
bra .1
2018-10-09 15:47:06 +00:00
2018-11-06 16:31:13 +00:00
.3 pla get hFD...
2018-11-07 21:48:48 +00:00
2018-11-06 16:31:13 +00:00
ldx #0
2018-11-07 21:48:48 +00:00
2018-11-06 16:31:13 +00:00
.4 cmp SKT.TABLE,x
beq .5
2018-11-07 21:48:48 +00:00
2018-11-06 16:31:13 +00:00
inx
cpx #K.SKTTABLE.SIZE
bne .4
2018-11-07 21:48:48 +00:00
2018-11-06 16:31:13 +00:00
.5 stz SKT.TABLE,x
>SYSCALL freemem
clc
rts
2018-11-06 16:31:13 +00:00
SKT.shutdown.STREAM
pla
2018-11-11 22:05:04 +00:00
jsr SKT.GetTCB
2018-09-28 15:24:44 +00:00
ldy #S.SOCKET.TCP.S
2018-09-13 15:29:02 +00:00
lda (ZPPtrSKT),y
2018-11-11 22:05:04 +00:00
cmp #S.SOCKET.TCP.S.ESTBLSH
2018-11-06 16:31:13 +00:00
bne .1
2018-10-09 15:47:06 +00:00
2018-11-11 22:05:04 +00:00
lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA
bcs .9
2018-10-09 15:47:06 +00:00
2018-11-11 22:05:04 +00:00
lda #S.SOCKET.TCP.S.FINWT1
jmp SKT.StoreTCB.S
.1 cmp #S.SOCKET.TCP.S.TIMEWT
beq .8
lda #S.TCP.OPTIONS.RST+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA
bcs .9
2018-09-13 15:29:02 +00:00
2018-11-11 22:05:04 +00:00
lda #S.SOCKET.TCP.S.TIMEWT
jmp SKT.StoreTCB.S
.8 clc
.9 rts
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Read (STREAM)
2018-09-11 21:15:15 +00:00
* ## C
* `int skt.read(hFD fd, void *buf, int count);`
* ## ASM
* **In:**
* `>PUSHWI count`
* `>PUSHW buf`
* `lda fd`
2019-03-02 20:47:58 +00:00
* `>LIBCALL hLIBTCPIP,LIBTCPIP.read`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-09-11 21:15:15 +00:00
* CC: Y,A = bytes read
* CS: A = EC
2018-08-29 15:01:02 +00:00
*\--------------------------------------
2018-11-09 13:29:23 +00:00
SKT.Read jsr SKT.PullhFDDataInPtrLen
2018-10-09 15:47:06 +00:00
2019-03-02 20:47:58 +00:00
jsr SKT.EOF.I
bcs .9 I/O error
2018-08-29 15:01:02 +00:00
2019-03-02 20:47:58 +00:00
tay
beq .9 exit with CC,Y,A = 0
jmp SKT.GetDataFromSktIn
2018-08-29 15:01:02 +00:00
2019-03-02 20:47:58 +00:00
.9 rts
2018-08-29 15:01:02 +00:00
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Write (STREAM)
2018-09-11 21:15:15 +00:00
* ## C
* `int skt.write(hFD fd, const void *buf, int count);`
* ## ASM
* **In:**
* `>PUSHWI count`
* `>PUSHW buf`
* `lda fd`
2019-03-02 20:47:58 +00:00
* `>LIBCALL hLIBTCPIP,LIBTCPIP.write`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-09-11 21:15:15 +00:00
* CC: Y,A = bytes written
* CS: A = EC
2017-02-13 07:26:18 +00:00
*\--------------------------------------
2018-11-09 13:29:23 +00:00
SKT.Write jsr SKT.PullhFDDataInPtrLen
2017-02-13 07:26:18 +00:00
2019-03-02 20:47:58 +00:00
jsr SKT.CheckStream
bcs .9
2018-11-11 22:05:04 +00:00
jsr SKT.AddDataToSktOut will call SKT.GetTCB
bcs .90
jsr TCP.OUT.I SKT.GetTCB called, try to push, ignore error....
clc
rts
2018-10-09 15:47:06 +00:00
.90 lda #0 no data transfered
sec
2019-03-02 20:47:58 +00:00
.9 rts
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Recv (RAW,DGRAM,SEQPACKET)
* # RecvFrom (RAW,DGRAM,SEQPACKET)
2018-10-08 15:41:00 +00:00
* ## C
* `hMem recv(hFD fd);`
* `hMem recvfrom(hFD fd, struct sockaddr *addr);`
2018-10-01 05:48:42 +00:00
* ## ASM
* **In:**
* `>PUSHW addr` (RecvFrom)
* `lda fd`
2019-03-02 20:47:58 +00:00
* `>LIBCALL hLIBTCPIP,LIBTCPIP.Recv`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-10-01 05:48:42 +00:00
* CC: A = hMem
* CS: A = EC
*\--------------------------------------
2018-11-01 08:53:47 +00:00
SKT.RecvFrom pha
>PULLW ZPTmpPtr1 addr
pla
sec
2018-10-01 15:52:58 +00:00
.HS 90 BCC
SKT.Recv clc
2018-11-01 08:53:47 +00:00
php
2018-10-01 15:52:58 +00:00
>SYSCALL GetMemPtr
2018-10-01 05:48:42 +00:00
>STYA ZPPtrSKT
2018-10-09 15:47:06 +00:00
2018-10-01 15:52:58 +00:00
ldy #S.SOCKET.T
lda (ZPPtrSKT),y
cmp #S.SOCKET.T.STREAM
beq .99
ldy #S.SOCKET.HQ.TAIL
lda (ZPPtrSKT),y
tax
2018-10-09 15:47:06 +00:00
ldy #S.SOCKET.HQ.HEAD
cmp (ZPPtrSKT),y
2018-10-01 15:52:58 +00:00
beq .90
2018-10-09 15:47:06 +00:00
inc
cmp #S.SOCKET.HQ.MAX
bne .1
lda #0
2018-10-09 15:47:06 +00:00
.1 ldy #S.SOCKET.HQ.TAIL
sta (ZPPtrSKT),y
2018-10-09 15:47:06 +00:00
txa
clc
adc #S.SOCKET.HQ
tay
lda (ZPPtrSKT),y
2018-10-01 15:52:58 +00:00
plp
2018-11-01 08:53:47 +00:00
bcc .9 Exit with CC and A=hFrame
2018-10-01 15:52:58 +00:00
pha
>SYSCALL GetMemPtr
>STYA ZPFrameInPtr
2018-10-09 15:47:06 +00:00
ldy #S.IP.SRC
.2 lda (ZPFrameInPtr),y
sta SA.REMOTE+S.SOCKADDR.ADDR-S.IP.SRC,y
iny
cpy #S.IP.SRC+4
bne .2
ldy #S.IP.PROTOCOL
lda (ZPFrameInPtr),y
cmp #S.IP.PROTOCOL.ICMP
bne .3
ldy #S.ICMP.IDENTIFIER
bra .7
.3 cmp #S.IP.PROTOCOL.TCP
beq .6
cmp #S.IP.PROTOCOL.UDP
bne .8
.6 ldy #S.TCPUDP.SRCPORT
.7 lda (ZPFrameInPtr),y
sta SA.REMOTE+S.SOCKADDR+1
iny
lda (ZPFrameInPtr),y
sta SA.REMOTE+S.SOCKADDR
.8 lda #S.SOCKADDR-1
.80 lda SA.REMOTE,y
sta (ZPTmpPtr1),y
dey
bpl .80
2018-10-01 15:52:58 +00:00
pla
clc
.9 rts
2018-10-09 15:47:06 +00:00
2018-10-01 15:52:58 +00:00
.99 plp
lda #ERR.SKT.BAD
sec
2018-11-07 21:48:48 +00:00
rts
2018-10-09 15:47:06 +00:00
2018-10-01 15:52:58 +00:00
.90 plp
lda #0 no data
sec
rts
*/--------------------------------------
2018-10-10 15:39:22 +00:00
* # Send (RAW,DGRAM,SEQPACKET)
* # SendTo (RAW,DGRAM,SEQPACKET)
2018-09-17 15:42:38 +00:00
* ## C
* `int skt.send(hFD fd, const void *buf, int count);`
2018-10-01 05:48:42 +00:00
* `int skt.sendto(hFD fd, const void *buf, int count, const struct sockaddr *addr);`
2018-09-17 15:42:38 +00:00
* ## ASM
* **In:**
2018-10-01 05:48:42 +00:00
* `>PUSHW addr` (SendTo)
2018-09-17 15:42:38 +00:00
* `>PUSHWI count`
* `>PUSHW buf`
* `lda fd`
2019-03-02 20:47:58 +00:00
* `>LIBCALL hLIBTCPIP,LIBTCPIP.send`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-09-17 15:42:38 +00:00
* CC: Y,A = bytes written
* CS: A = EC
*\--------------------------------------
2018-10-01 15:52:58 +00:00
SKT.SendTo sec
.HS 90 BCC
SKT.Send clc
php
2018-11-09 13:29:23 +00:00
jsr SKT.PullhFDDataInPtrLen
2018-10-01 15:52:58 +00:00
plp
bcc .1
jsr SKT.PullRemAddr
2018-11-01 08:53:47 +00:00
jsr SKT.SetRemAddr
.1 ldy #S.SOCKET.T
2018-10-01 05:48:42 +00:00
lda (ZPPtrSKT),y
2018-10-01 15:52:58 +00:00
tax
2018-11-07 21:48:48 +00:00
jmp (J.SKT.send,x)
2018-08-29 15:01:02 +00:00
*--------------------------------------
2018-10-08 15:41:00 +00:00
SKT.Send.RAW ldy #S.SOCKET.PROTO
2018-08-29 15:01:02 +00:00
lda (ZPPtrSKT),y
tax
>LDYA ZPDataInLen
jsr FRM.NewIP
2018-09-17 15:42:38 +00:00
bcs SKT.Send.9
2018-10-01 15:52:58 +00:00
bra SKT.Send.DGRAM.8
2018-08-29 15:01:02 +00:00
*--------------------------------------
2018-10-01 15:52:58 +00:00
SKT.Send.DGRAM ldx #S.IP.PROTOCOL.UDP
2018-08-29 15:01:02 +00:00
>LDYA ZPDataInLen
jsr FRM.NewIP
2018-09-17 15:42:38 +00:00
bcs SKT.Send.9
jsr SKT.SetFrameOutTCPUDPPorts
2018-10-01 15:52:58 +00:00
SKT.Send.DGRAM.8
jsr SKT.SetFrameOutDstIP
2018-11-07 21:48:48 +00:00
jsr SKT.CopyDataInToOut
2018-08-29 15:01:02 +00:00
jmp FRM.SendIP
2018-10-01 15:52:58 +00:00
*--------------------------------------
SKT.Send.STREAM lda #ERR.SKT.BAD
sec
2018-10-08 15:41:00 +00:00
SKT.Send.9 rts
2018-10-01 15:52:58 +00:00
*--------------------------------------
SKT.Send.SEQPACKET
bra *
2018-10-01 05:48:42 +00:00
*/--------------------------------------
2018-11-08 14:23:06 +00:00
* # GetSockOpt
* Set Socket Options
2018-10-01 05:48:42 +00:00
* ## C
2018-11-08 14:23:06 +00:00
* `int getsockopt(hFD fd);`
2018-10-01 05:48:42 +00:00
* ## ASM
* **In:**
2018-11-08 14:23:06 +00:00
* `lda fd`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.GetSockOpt`
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-10-01 05:48:42 +00:00
*\--------------------------------------
2018-11-08 14:23:06 +00:00
SKT.getsockopt >SYSCALL GetMemPtr
>STYA ZPPtrSKT
ldy #S.SOCKET.O
lda (ZPPtrSKT),y
* clc
2018-10-01 05:48:42 +00:00
rts
2018-11-07 21:48:48 +00:00
*/--------------------------------------
* # SetSockOpt
* Set Socket Options
* ## C
* `int setsockopt(hFD fd, short int opts);`
* ## ASM
* **In:**
* `>PUSHWI opts`
* `lda fd`
* `>LIBCALL hLIBTCPIP,LIBTCPIP.SetSockOpt`
* ## RETURN VALUE
*\--------------------------------------
SKT.setsockopt >SYSCALL GetMemPtr
>STYA ZPPtrSKT
>PULLA
ldy #S.SOCKET.O
ora (ZPPtrSKT),y
sta (ZPPtrSKT),y
2018-11-08 14:23:06 +00:00
* clc
rts
2019-03-02 20:47:58 +00:00
*--------------------------------------
2019-03-01 14:36:20 +00:00
SKT.EOF >SYSCALL GetMemPtr
>STYA ZPPtrSKT
2019-03-02 20:47:58 +00:00
SKT.EOF.I ldy #S.SOCKET.TCP.INUSED
2019-03-01 14:36:20 +00:00
lda (ZPPtrSKT),y
iny
ora (ZPPtrSKT),y
2019-03-04 07:14:31 +00:00
bne .8 some DATA
2019-03-02 20:47:58 +00:00
jsr SKT.CheckStream
bcs .9
lda #0 no DATA
.8 clc
.9 rts
*--------------------------------------
SKT.CheckStream ldy #S.SOCKET.T
lda (ZPPtrSKT),y
cmp #S.SOCKET.T.STREAM
bne .99
ldy #S.SOCKET.O
lda (ZPPtrSKT),y
and #S.SOCKET.O.ACCEPTCONN
bne .99
ldy #S.SOCKET.TCP.S
lda (ZPPtrSKT),y
2019-03-07 20:40:06 +00:00
cmp #S.SOCKET.TCP.S.ESTBLSH
bcc .91
2019-03-02 20:47:58 +00:00
cmp #S.SOCKET.TCP.S.CLWAIT
bcs .91
rts CC=ESTBLSH...or less
.91 lda #MLI.E.IO
sec
rts
.99 lda #ERR.SKT.BAD
sec
2019-03-01 14:36:20 +00:00
rts
2018-11-08 14:23:06 +00:00
*/--------------------------------------
* # GetTable
* Get socket table
* ## C
* `void * gettable();`
* ## ASM
* **In:**
* `>LIBCALL hLIBTCPIP,LIBTCPIP.GetTable`
* ## RETURN VALUE
*\--------------------------------------
SKT.GetTable >LDYA L.SKT.Table
2018-11-07 21:48:48 +00:00
clc
rts
*--------------------------------------
2018-11-09 13:29:23 +00:00
SKT.PullhFDDataInPtrLen
>SYSCALL GetMemPtr
>STYA ZPPtrSKT
>PULLW ZPDataInPtr !!!DataOut trashed when sending ACK in TCP.OUT
>PULLW ZPDataInLen !!!use DataInPtr/Len
rts
*--------------------------------------
2018-10-01 15:52:58 +00:00
SKT.PullLocAddr >PULLW ZPTmpPtr1
2018-10-01 05:48:42 +00:00
ldy #S.SOCKADDR-1
.1 lda (ZPTmpPtr1),y
sta SKT.LOC.ADDR,y
dey
2018-10-10 15:39:22 +00:00
bpl .1
2018-10-01 05:48:42 +00:00
rts
2018-11-07 21:48:48 +00:00
*--------------------------------------
2018-10-01 15:52:58 +00:00
SKT.PullRemAddr >PULLW ZPTmpPtr1
2018-10-01 05:48:42 +00:00
ldy #S.SOCKADDR-1
.1 lda (ZPTmpPtr1),y
sta SKT.REM.ADDR,y
dey
2018-10-10 15:39:22 +00:00
bpl .1
2018-10-01 05:48:42 +00:00
rts
*--------------------------------------
2018-11-06 16:31:13 +00:00
SKT.SetLocAddr ldy #S.SOCKET.LOC.PORT+1
2018-10-10 15:39:22 +00:00
.1 lda SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y
2018-10-01 05:48:42 +00:00
sta (ZPPtrSKT),y
2018-11-06 16:31:13 +00:00
dey
cpy #S.SOCKET.LOC.ADDR
bcs .1
2018-10-01 05:48:42 +00:00
rts
*--------------------------------------
2018-11-06 16:31:13 +00:00
SKT.SetRemAddr ldy #S.SOCKET.REM.PORT+1
2018-10-10 15:39:22 +00:00
.1 lda SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y
2018-10-01 05:48:42 +00:00
sta (ZPPtrSKT),y
2018-11-06 16:31:13 +00:00
dey
cpy #S.SOCKET.REM.ADDR
bcs .1
2018-10-01 05:48:42 +00:00
rts
*--------------------------------------
SKT.FindMatchingLocRem
2018-11-09 13:29:23 +00:00
.DO IPDEBUG=1
2018-11-09 07:45:36 +00:00
jsr FRM.Dump
2018-11-09 13:29:23 +00:00
.FIN
2018-10-01 05:48:42 +00:00
ldx #0
2018-11-01 08:53:47 +00:00
2018-10-01 05:48:42 +00:00
.1 lda SKT.TABLE,x
beq .8
2018-11-01 08:53:47 +00:00
2018-10-09 15:47:06 +00:00
phx
2018-10-01 05:48:42 +00:00
>SYSCALL GetMemPtr
2018-11-08 14:23:06 +00:00
>STYA ZPPtrSKT
2018-11-09 13:29:23 +00:00
.DO IPDEBUG=1
2018-11-09 07:45:36 +00:00
jsr SKT.Dump
2018-11-09 13:29:23 +00:00
.FIN
2018-10-09 15:47:06 +00:00
plx
2018-11-01 08:53:47 +00:00
ldy #S.SOCKET.AF
2018-11-08 14:23:06 +00:00
lda (ZPPtrSKT),y
2018-11-01 08:53:47 +00:00
cmp #AF.INET
bne .8
ldy #S.SOCKET.LOC.ADDR
2018-11-08 14:23:06 +00:00
.2 lda (ZPPtrSKT),y
2018-10-01 05:48:42 +00:00
bne .4
2018-11-01 08:53:47 +00:00
2018-11-07 21:48:48 +00:00
ldy #S.SOCKET.LOC.PORT bound to 0.0.0.0,check only LOC port
2018-10-01 05:48:42 +00:00
2018-11-08 14:23:06 +00:00
.3 lda (ZPPtrSKT),y
2018-11-01 08:53:47 +00:00
2018-10-10 15:39:22 +00:00
.4 cmp SKT.LOC.ADDR+S.SOCKADDR.ADDR-S.SOCKET.LOC.ADDR,y
2018-10-01 05:48:42 +00:00
bne .8
iny
2018-11-01 08:53:47 +00:00
cpy #S.SOCKET.LOC.PORT+2
2018-10-01 05:48:42 +00:00
bne .3
2018-11-01 08:53:47 +00:00
ldy #S.SOCKET.O
2018-11-08 14:23:06 +00:00
lda (ZPPtrSKT),y
2018-11-01 08:53:47 +00:00
and #S.SOCKET.O.ACCEPTCONN
beq .6
2018-11-07 21:48:48 +00:00
2018-11-01 08:53:47 +00:00
ldy #S.TCP.OPTIONS Listening, only SYN packet....
lda (ZPFrameInPtr),y
cmp #S.TCP.OPTIONS.SYN
2018-11-07 21:48:48 +00:00
beq .7 SYN recieved on a LISTEN socket, ok
2018-11-01 08:53:47 +00:00
bne .8 bad packet for this listening
.6 lda SKT.REM.ADDR+S.SOCKADDR.ADDR
2018-11-09 07:45:36 +00:00
2018-10-01 05:48:42 +00:00
cmp #$ff FF.FF.FF.FF, Broadcast ?
2018-11-01 08:53:47 +00:00
bne .41
* ldy #S.SOCKET.O
2018-11-08 14:23:06 +00:00
lda (ZPPtrSKT),y
2018-10-01 05:48:42 +00:00
and #S.SOCKET.O.BROADCAST
beq .9 this socket does not accept broadcast
2018-11-09 13:29:23 +00:00
bra .43
2018-11-01 08:53:47 +00:00
.41 ldy #S.SOCKET.REM.ADDR
2018-11-07 21:48:48 +00:00
2018-11-09 07:45:36 +00:00
.5 lda (ZPPtrSKT),y
cmp #$ff accept 255.255.255.255 ?
2018-11-09 13:29:23 +00:00
bne .42
2018-11-09 07:45:36 +00:00
2018-11-09 13:29:23 +00:00
.43 ldy #S.SOCKET.REM.PORT Boradcast, check port only
2018-11-09 07:45:36 +00:00
.42 lda (ZPPtrSKT),y
2018-11-09 13:29:23 +00:00
cmp SKT.REM.ADDR+S.SOCKADDR.ADDR-S.SOCKET.REM.ADDR,y
2018-11-01 08:53:47 +00:00
bne .8 wrong remote host, exit....
2018-10-01 05:48:42 +00:00
iny
cpy #S.SOCKET.REM.PORT+2
2018-11-09 07:45:36 +00:00
bne .42
2018-10-01 05:48:42 +00:00
2018-11-08 14:23:06 +00:00
.7 stx SKT.Index x = SKT.TABLE index
2018-10-01 05:48:42 +00:00
clc
rts
2018-11-01 08:53:47 +00:00
2018-10-01 05:48:42 +00:00
.8 inx
cpx #K.SKTTABLE.SIZE
bne .1
2018-11-01 08:53:47 +00:00
2018-10-01 05:48:42 +00:00
.9 sec
rts
*--------------------------------------
2018-11-01 08:53:47 +00:00
SKT.AddToQueueA pha
ldy #S.SOCKET.HQ.HEAD
lda (ZPPtrSKT),y
tax
inc
cmp #S.SOCKET.HQ.MAX
bne .1
lda #0
2018-11-01 08:53:47 +00:00
.1 ldy #S.SOCKET.HQ.TAIL
cmp (ZPPtrSKT),y
beq .9 Queue full!!
2018-11-01 08:53:47 +00:00
ldy #S.SOCKET.HQ.HEAD
sta (ZPPtrSKT),y
txa
clc
adc #S.SOCKET.HQ
tay
2018-11-01 08:53:47 +00:00
pla
sta (ZPPtrSKT),y
clc
rts
2018-11-01 08:53:47 +00:00
.9 pla dicard hFrame
* sec
rts
*--------------------------------------
* From TCP.IN
* Src : ZPDataInPtr/ZPDataInLen
* Dst : hInMem/INHEAD
*--------------------------------------
SKT.AddDataToSktIn
2018-11-08 14:23:06 +00:00
ldx SKT.Cache+S.SOCKET.TCP.INFREE
cpx ZPDataInLen
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.INFREE+1
sbc ZPDataInLen+1
bcc .9 Not enough room in Q
2018-11-01 08:53:47 +00:00
ldy #S.TCP.SEQNUM+3
ldx #3
.10 lda (ZPFrameInPtr),y
2018-11-08 14:23:06 +00:00
eor SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x
bne .9
dey
dex
bpl .10
2018-11-01 08:53:47 +00:00
ldy #S.SOCKET.SQ.hInMem
lda (ZPPtrSKT),y
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
>STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base
lda ZPTmpPtr1
clc
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.INHEAD
sta ZPTmpPtr2
lda ZPTmpPtr1+1
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.INHEAD+1
sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail
2018-11-01 08:53:47 +00:00
lda ZPDataInLen
eor #$FF
tax
2018-11-01 08:53:47 +00:00
lda ZPDataInLen+1
eor #$FF
pha
2018-11-01 08:53:47 +00:00
ldy #0
.1 inx
bne .2
pla
inc
beq .8
2018-11-01 08:53:47 +00:00
pha
2018-11-01 08:53:47 +00:00
.2 lda (ZPDataInPtr),y
sta (ZPTmpPtr2)
iny
bne .3
inc ZPDataInPtr+1
.3 inc ZPTmpPtr2
bne .4
inc ZPTmpPtr2+1
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
.4 inc SKT.Cache+S.SOCKET.TCP.INHEAD
bne .1
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.INHEAD+1
lda SKT.Cache+S.SOCKET.TCP.INHEAD+1
cmp /K.TCP.WSIZE
bne .1
2018-11-08 14:23:06 +00:00
stz SKT.Cache+S.SOCKET.TCP.INHEAD+1
2018-11-01 08:53:47 +00:00
lda ZPTmpPtr1 Dst Ptr=Buffer Base
sta ZPTmpPtr2
lda ZPTmpPtr1+1
sta ZPTmpPtr2+1
bra .1
.9 sec
rts
2018-11-01 08:53:47 +00:00
2018-11-09 13:29:23 +00:00
.8 >SBC16 SKT.Cache+S.SOCKET.TCP.INFREE,ZPDataInLen
>ADC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPDataInLen
2018-11-01 08:53:47 +00:00
clc
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+3
adc ZPDataInLen
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+3
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+2
adc ZPDataInLen+1
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+2
bcc .80
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+1
bne .80
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM
.80 clc
rts
*--------------------------------------
* From SKT.Read
* In:
* Src : hInMem/INTAIL
* Dst : ZPDataOutPtr/ZPDataOutLen
* Out:
* Y,A = bytes read
*--------------------------------------
SKT.GetDataFromSktIn
jsr SKT.GetTCB
2019-03-02 20:47:58 +00:00
ldy #S.SOCKET.SQ.hInMem
lda (ZPPtrSKT),y
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
>STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base
lda ZPTmpPtr1
clc
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.INTAIL
sta ZPTmpPtr2
lda ZPTmpPtr1+1
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.INTAIL+1
sta ZPTmpPtr2+1
2018-11-01 08:53:47 +00:00
2018-09-04 15:29:15 +00:00
lda ZPDataInLen
eor #$FF
tax
2018-11-01 08:53:47 +00:00
2018-09-04 15:29:15 +00:00
lda ZPDataInLen+1
eor #$FF
pha
2018-11-01 08:53:47 +00:00
stz ZPTmpPtr3 Reset byte counter
stz ZPTmpPtr3+1
2018-11-01 08:53:47 +00:00
ldy #0
2018-11-01 08:53:47 +00:00
.1 inx Check if room left in dest buffer
bne .2
pla
inc
beq .8
pha
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
.2 lda SKT.Cache+S.SOCKET.TCP.INTAIL
eor SKT.Cache+S.SOCKET.TCP.INHEAD
bne .3
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.INTAIL+1
eor SKT.Cache+S.SOCKET.TCP.INHEAD+1
2018-11-07 21:48:48 +00:00
beq .7
2018-11-01 08:53:47 +00:00
.3 lda (ZPTmpPtr2)
pha
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.INTAIL
2018-09-03 11:27:11 +00:00
bne .4
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.INTAIL+1
lda SKT.Cache+S.SOCKET.TCP.INTAIL+1
cmp /K.TCP.WSIZE
bne .4
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
stz SKT.Cache+S.SOCKET.TCP.INTAIL+1
lda ZPTmpPtr1
sta ZPTmpPtr2
lda ZPTmpPtr1+1
sta ZPTmpPtr2+1
bra .5
2018-11-01 08:53:47 +00:00
.4 inc ZPTmpPtr2
bne .5
inc ZPTmpPtr2+1
2018-11-01 08:53:47 +00:00
.5 pla get back data....
2018-11-01 08:53:47 +00:00
2018-09-04 15:29:15 +00:00
.6 sta (ZPDataInPtr),y
iny
bne .61
2018-09-04 15:29:15 +00:00
inc ZPDataInPtr+1
2018-11-01 08:53:47 +00:00
.61 inc ZPTmpPtr3
bne .1
inc ZPTmpPtr3+1
2018-11-01 08:53:47 +00:00
bra .1
2018-11-01 08:53:47 +00:00
.7 pla discard byte counter HI
2019-03-02 20:47:58 +00:00
.8 >ADC16 SKT.Cache+S.SOCKET.TCP.INFREE,ZPTmpPtr3
2018-11-09 13:29:23 +00:00
>SBC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPTmpPtr3
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3
clc
adc ZPTmpPtr3
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3
lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+2
adc ZPTmpPtr3+1
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM+2
2018-11-01 08:53:47 +00:00
bcc .80
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM+1
bne .80
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM
2018-11-01 08:53:47 +00:00
.80 jsr SKT.StoreTCB
2018-09-28 15:24:44 +00:00
ldy #S.SOCKET.TCP.O
lda (ZPPtrSKT),y
ora #S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
jsr TCP.OUT.I SKT.GetTCB already called, Try to ACK read DATA
2018-11-01 08:53:47 +00:00
>LDYA ZPTmpPtr3
clc
rts
*--------------------------------------
* From SKT.Write.TCP
* Src : ZPDataInPtr/ZPDataInLen
* Dst : hOutMem/OUTHEAD
*--------------------------------------
SKT.AddDataToSktOut
jsr SKT.GetTCB
2018-11-08 14:23:06 +00:00
ldx SKT.Cache+S.SOCKET.TCP.OUTFREE
cpx ZPDataInLen
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.OUTFREE+1
sbc ZPDataInLen+1
bcc .9 Not enough room in Q
2018-11-07 21:48:48 +00:00
ldy #S.SOCKET.SQ.hOutMem
lda (ZPPtrSKT),y
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
>STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base
lda ZPTmpPtr1
clc
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.OUTHEAD
sta ZPTmpPtr2
lda ZPTmpPtr1+1
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.OUTHEAD+1
sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail
2018-11-01 08:53:47 +00:00
lda ZPDataInLen
eor #$FF
tax
2018-11-01 08:53:47 +00:00
lda ZPDataInLen+1
eor #$FF
pha
2018-11-01 08:53:47 +00:00
ldy #0
.1 inx
bne .2
pla
inc
beq .8
2018-11-01 08:53:47 +00:00
pha
2018-11-01 08:53:47 +00:00
.2 lda (ZPDataInPtr),y
sta (ZPTmpPtr2)
iny
bne .3
inc ZPDataInPtr+1
.3 inc ZPTmpPtr2
bne .4
inc ZPTmpPtr2+1
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
.4 inc SKT.Cache+S.SOCKET.TCP.OUTHEAD
bne .1
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.OUTHEAD+1
lda SKT.Cache+S.SOCKET.TCP.OUTHEAD+1
cmp /K.TCP.WSIZE
bne .1
2018-11-08 14:23:06 +00:00
stz SKT.Cache+S.SOCKET.TCP.OUTHEAD+1
2018-11-01 08:53:47 +00:00
lda ZPTmpPtr1 Dst Ptr=Buffer Base
sta ZPTmpPtr2
lda ZPTmpPtr1+1
sta ZPTmpPtr2+1
bra .1
.9 sec
rts
2018-11-01 08:53:47 +00:00
2018-11-09 13:29:23 +00:00
.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTFREE,ZPDataInLen
>ADC16 SKT.Cache+S.SOCKET.TCP.OUTUSED,ZPDataInLen
>ADC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataInLen
2018-11-01 08:53:47 +00:00
jmp SKT.StoreTCB
*--------------------------------------
* From TCP.OUT
* Src : hOutMem/OUTTAIL
* Dst : ZPDataOutPtr/ZPDataOutLen
*--------------------------------------
SKT.GetDataFromSktOut
ldy #S.SOCKET.SQ.hOutMem
lda (ZPPtrSKT),y
2018-11-01 08:53:47 +00:00
2018-07-18 15:30:42 +00:00
>SYSCALL GetMemPtr
>STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base
lda ZPTmpPtr1
clc
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT
sta ZPTmpPtr2 Make ZPTmpPtr2=base+nexttail
lda ZPTmpPtr1+1
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1
sta ZPTmpPtr2+1
2018-11-01 08:53:47 +00:00
lda ZPDataOutLen
eor #$FF
tax
2018-11-01 08:53:47 +00:00
lda ZPDataOutLen+1
eor #$FF
pha
2018-11-01 08:53:47 +00:00
ldy #0
.1 inx
bne .2
pla
inc
beq .8
2018-11-01 08:53:47 +00:00
pha
2018-11-01 08:53:47 +00:00
.2 lda (ZPTmpPtr2)
sta (ZPDataOutPtr),y
iny
bne .3
inc ZPDataOutPtr+1
.3 inc ZPTmpPtr2
bne .4
inc ZPTmpPtr2+1
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
.4 inc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT
bne .1
2018-11-08 14:23:06 +00:00
inc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1
lda SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1
cmp /K.TCP.WSIZE
bne .1
2018-11-08 14:23:06 +00:00
stz SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1
2018-11-01 08:53:47 +00:00
lda ZPTmpPtr1 Dst Ptr=Buffer Base
sta ZPTmpPtr2
lda ZPTmpPtr1+1
sta ZPTmpPtr2+1
bra .1
2018-11-09 13:29:23 +00:00
.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataOutLen
2018-11-01 08:53:47 +00:00
clc
rts
*--------------------------------------
* From TCP.IN
* Src : A,X
* Dst : hOutMem/OUTTAIL
*--------------------------------------
SKT.AckDataToSktOut
ldy #S.TCP.ACKNUM+3 Get new ACK number from FrameIn...
ldx #3 Substract old ACK from socket
sec
.1 lda (ZPFrameInPtr),y
pha
2018-11-08 14:23:06 +00:00
sbc SKT.Cache+S.SOCKET.TCP.OUTSEQNUM,x
sta TmpDWord,x
pla ....and Set SEQ = new SEQ
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTSEQNUM,x
dey
dex
bpl .1
2018-11-01 08:53:47 +00:00
lda TmpDWord+3
ldx TmpDWord+2
bne .2
tay
beq .8
2018-11-01 08:53:47 +00:00
.2 clc
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.OUTTAIL
sta SKT.Cache+S.SOCKET.TCP.OUTTAIL
2018-11-01 08:53:47 +00:00
txa
2018-11-08 14:23:06 +00:00
adc SKT.Cache+S.SOCKET.TCP.OUTTAIL+1
and /K.TCP.WSIZE-1
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTTAIL+1
2018-11-09 13:29:23 +00:00
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.OUTFREE
clc
adc TmpDWord+3
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTFREE
lda SKT.Cache+S.SOCKET.TCP.OUTFREE+1
adc TmpDWord+2
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTFREE+1
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
lda SKT.Cache+S.SOCKET.TCP.OUTUSED
sec
sbc TmpDWord+3
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTUSED
lda SKT.Cache+S.SOCKET.TCP.OUTUSED+1
sbc TmpDWord+2
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTUSED+1
2018-11-01 08:53:47 +00:00
.8 rts
*--------------------------------------
2018-11-11 22:05:04 +00:00
SKT.NewTCB ldx #S.SOCKET.TCP.INTAIL
2018-11-01 08:53:47 +00:00
2018-11-08 14:23:06 +00:00
.1 stz SKT.Cache,x
2018-11-01 08:53:47 +00:00
inx
cpx #S.SOCKET.TCP
2018-10-08 15:41:00 +00:00
bne .1
2018-11-01 08:53:47 +00:00
>LDYAI K.TCP.WSIZE
2018-11-08 14:23:06 +00:00
>STYA SKT.Cache+S.SOCKET.TCP.INFREE
2018-11-01 08:53:47 +00:00
>SYSCALL getmem
2018-11-11 22:05:04 +00:00
bcs .9
2018-11-01 08:53:47 +00:00
txa
ldy #S.SOCKET.SQ.hInMem
sta (ZPPtrSKT),y
2018-10-08 15:41:00 +00:00
2018-11-01 08:53:47 +00:00
>LDYAI K.TCP.WSIZE
2018-11-08 14:23:06 +00:00
>STYA SKT.Cache+S.SOCKET.TCP.OUTFREE
2018-11-01 08:53:47 +00:00
>SYSCALL getmem
2018-11-11 22:05:04 +00:00
bcs .9
2018-11-01 08:53:47 +00:00
txa
ldy #S.SOCKET.SQ.hOutMem
2018-10-08 15:41:00 +00:00
sta (ZPPtrSKT),y
2018-11-01 08:53:47 +00:00
ldx #3
.2 lda A2osX.TIMER16,x
2018-11-08 14:23:06 +00:00
sta SKT.Cache+S.SOCKET.TCP.OUTNEXTSEQ,x
2018-11-01 08:53:47 +00:00
dex
bpl .2
2018-11-11 22:05:04 +00:00
* clc
.9 rts
2018-11-01 08:53:47 +00:00
*--------------------------------------
2018-11-11 22:05:04 +00:00
SKT.StoreTCB.S ldy #S.SOCKET.TCP.S
sta (ZPPtrSKT),y
SKT.StoreTCB ldy #S.SOCKET.TCP.INTAIL
2018-11-08 14:23:06 +00:00
.1 lda SKT.Cache,y
2018-11-01 08:53:47 +00:00
sta (ZPPtrSKT),y
iny
cpy #S.SOCKET.TCP
bne .1
2018-11-07 21:48:48 +00:00
clc
2018-11-01 08:53:47 +00:00
rts
*--------------------------------------
2018-11-11 22:05:04 +00:00
SKT.GetTCB ldy #S.SOCKET.TCP.INTAIL
2018-11-01 08:53:47 +00:00
.1 lda (ZPPtrSKT),y
2018-11-08 14:23:06 +00:00
sta SKT.Cache,y
2018-11-01 08:53:47 +00:00
iny
cpy #S.SOCKET.TCP
bne .1
rts
*--------------------------------------
SKT.SetFrameOutDstIP
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.REM.ADDR
ldx #4
2018-11-01 08:53:47 +00:00
.1 lda (ZPPtrSKT),y
pha
iny
dex
bne .1
2018-11-01 08:53:47 +00:00
ldy #S.IP.DST+3
ldx #4
2018-11-01 08:53:47 +00:00
.2 pla
sta (ZPFrameOutPtr),y
dey
dex
bne .2
rts
*--------------------------------------
2018-09-17 15:42:38 +00:00
SKT.SetFrameOutTCPUDPPorts
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.LOC.PORT
2018-09-17 15:42:38 +00:00
lda (ZPPtrSKT),y
tax
iny
lda (ZPPtrSKT),y
ldy #S.TCPUDP.SRCPORT
sta (ZPFrameOutPtr),y
iny
txa
sta (ZPFrameOutPtr),y
2018-11-07 21:48:48 +00:00
2018-10-01 05:48:42 +00:00
ldy #S.SOCKET.REM.PORT
2018-09-17 15:42:38 +00:00
lda (ZPPtrSKT),y
tax
iny
lda (ZPPtrSKT),y
ldy #S.TCPUDP.DSTPORT
sta (ZPFrameOutPtr),y
iny
txa
sta (ZPFrameOutPtr),y
rts
*--------------------------------------
SKT.CopyDataInToOut
2017-02-13 07:26:18 +00:00
lda ZPDataInPtr+1
pha
lda ZPDataOutPtr+1
pha
2018-11-07 21:48:48 +00:00
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
2018-10-09 15:47:06 +00:00
.2 lda (ZPDataInPtr),y
sta (ZPDataOutPtr),y
iny
bne .1
inc ZPDataInPtr+1
inc ZPDataOutPtr+1
bne .1
2018-11-07 21:48:48 +00:00
2017-02-13 07:26:18 +00:00
.9 pla
sta ZPDataOutPtr+1
pla
sta ZPDataInPtr+1
rts
MAN
2018-11-17 17:17:13 +00:00
SAVE USR/SRC/LIB/LIBTCPIP.S.SKT
LOAD USR/SRC/LIB/LIBTCPIP.S
ASM