From 16d0c31b3ec40111b4066142843b74f9d3d92241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 11 Sep 2018 23:15:15 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Docs/LIBTCPIP.md | 37 +++++++++++++++++++++---------- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/TELNET.S.txt | 13 ++++++----- DRV/CONSOLE.DRV.S.txt | 6 ++--- LIB/LIBTCPIP.S.SKT.txt | 46 ++++++++++++++++++++++++--------------- LIB/LIBTCPIP.S.TCP.txt | 18 ++++++++++++--- 7 files changed, 79 insertions(+), 41 deletions(-) diff --git a/.Docs/LIBTCPIP.md b/.Docs/LIBTCPIP.md index 3655f526..339b62ea 100644 --- a/.Docs/LIBTCPIP.md +++ b/.Docs/LIBTCPIP.md @@ -94,21 +94,34 @@ A = hFile # SKT.Read (STREAM) - Read data in pBuf -**In:** - PUSHB = hSocket - PUSHW = pBuf - PUSHW = len + +## C +`int skt.read(hFD fd, void *buf, int count);` + +## ASM +**In:** +`>PUSHWI count` +`>PUSHW buf` +`lda fd` +`>SYSCALL read` **Out:** - Y,A = bytes transfered +CC: Y,A = bytes read +CS: A = EC # SKT.Write (STREAM) - Send block of data -**In:** - PUSHB = hSocket - PUSHW = pBuf - PUSHW = len -**Out:** + +## C +`int skt.write(hFD fd, const void *buf, int count);` + +## ASM +**In:** +`>PUSHWI count` +`>PUSHW buf` +`lda fd` +`>SYSCALL write` +**Out:** +CC: Y,A = bytes written +CS: A = EC # SKT.Rcvd (DGRAM,RAW) **In:** diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 062425a1be98fbaedc6614bb13ae2e0bd564fa20..050896f717df00e95006d83204b9d55874630fde 100644 GIT binary patch delta 6200 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 JT|cT_@P9gf-2VUo delta 18404 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 diff --git a/BIN/TELNET.S.txt b/BIN/TELNET.S.txt index 5d649ff4..30a960c2 100644 --- a/BIN/TELNET.S.txt +++ b/BIN/TELNET.S.txt @@ -11,7 +11,7 @@ AUTO 4,1 .INB INC/ETH.I .INB INC/LIBTCPIP.I *-------------------------------------- -TIMEOUT.MAX .EQ 20 2 sec. +TIMEOUT.MAX .EQ 40 4 sec. BUFSIZE .EQ 256 *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN @@ -169,9 +169,10 @@ CS.RUN.OPENSKT ldx #3 CS.RUN.LOOP >SLEEP - >PUSHB.G hSocket - >PUSHW ZPBufPtr >PUSHWI BUFSIZE + >PUSHW ZPBufPtr + >LDA.G hSocket + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Read bcc .1 @@ -204,9 +205,9 @@ CS.RUN.LOOP >SLEEP cmp #3 Ctrl-C beq CS.RUN.USER - >PUSHB.G hSocket - >PUSHW ZPBufPtr >PUSHW ZPBufLen + >PUSHW ZPBufPtr + >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcs CS.RUN.SKTERR @@ -287,7 +288,7 @@ hLIBTCPIP .BS 1 MSG.IPKO .AZ "TCP/IP Not Loaded/Configured." MSG.USAGE .AZ "Usage : TELNET [port]" MSG.UNKNOWN .AZ "%s: Unknown host\r\n" -MSG.HOSTOK .AZ "Connecting to %d.%d.%d.%d:%D (%s) ...\r\n" +MSG.HOSTOK .AZ "Connecting to %d.%d.%d.%d:%D (%s)..." MSG.SKTKO .AZ "Failed to Open Socket." MSG.SKTOK .AZ "Connected." MSG.SKTERR .AZ "Socket Error : $%h\r\n" diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index cb8f89a8..2d31fad5 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -1081,13 +1081,13 @@ KeyRemappedRGHT .HS 1B5B4300 esc[C TelnetOpt .DA #IAC,#DO,#TELOPT.ECHO TelnetOpt.LEN .EQ *-TelnetOpt *-------------------------------------- -WILLDO .DA #TELOPT.BINARY,#TELOPT.SGA,#TELOPT.NAWS +WILLDO .DA #TELOPT.BINARY,#TELOPT.SGA WILLDO.CNT .EQ *-WILLDO -WILLDONT .DA #TELOPT.TSPEED,#TELOPT.LINEMODE +WILLDONT .DA #TELOPT.TSPEED,#TELOPT.LINEMODE,#TELOPT.STATUS WILLDONT.CNT .EQ *-WILLDONT DOWILL .DA #TELOPT.BINARY,#TELOPT.SGA,#TELOPT.NAWS,#TELOPT.TTYPE DOWILL.CNT .EQ *-DOWILL -DOWONT .DA #TELOPT.NEWENVIRON +DOWONT .DA #TELOPT.NEWENVIRON,#TELOPT.XDISPLOC,#TELOPT.TSPEED,#TELOPT.LFLOW,#TELOPT.NAWS DOWONT.CNT .EQ *-DOWONT SB.IS.TTYPE .DA #IAC,#SB,#TELOPT.TTYPE,#SB.IS .AS 'XTERM' diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 64b9da7d..a271d9ae 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -328,17 +328,22 @@ SKT.MkNod sta .1+1 .9 rts */-------------------------------------- * # SKT.Read (STREAM) -* Read data in pBuf -* **In:** -* PUSHB = hSocket -* PUSHW = pBuf -* PUSHW = len +* ## C +* `int skt.read(hFD fd, void *buf, int count);` +* ## ASM +* **In:** +* `>PUSHWI count` +* `>PUSHW buf` +* `lda fd` +* `>SYSCALL read` * **Out:** -* Y,A = bytes transfered +* CC: Y,A = bytes read +* CS: A = EC *\-------------------------------------- -SKT.Read >PULLW ZPDataInLen !!!use DataInPtr/Len +SKT.Read pha >PULLW ZPDataInPtr !!!DataOut trashed when sending ACK in TCP.OUT - >PULLA + >PULLW ZPDataInLen !!!use DataInPtr/Len + pla SKT.Read.I jsr SKT.Get.I bcs .99 @@ -373,16 +378,22 @@ SKT.Read.I jsr SKT.Get.I .99 rts */-------------------------------------- * # SKT.Write (STREAM) -* Send block of data -* **In:** -* PUSHB = hSocket -* PUSHW = pBuf -* PUSHW = len -* **Out:** +* ## C +* `int skt.write(hFD fd, const void *buf, int count);` +* ## ASM +* **In:** +* `>PUSHWI count` +* `>PUSHW buf` +* `lda fd` +* `>SYSCALL write` +* **Out:** +* CC: Y,A = bytes written +* CS: A = EC *\-------------------------------------- -SKT.Write >PULLW ZPDataInLen +SKT.Write pha >PULLW ZPDataInPtr - >PULLA + >PULLW ZPDataInLen + pla jsr SKT.Get.I bcs .9 @@ -820,7 +831,8 @@ SKT.GetDataFromSktIn clc rts -.9 lda #0 NO DATA +.9 +* lda #0 NO DATA sec rts *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 04a1ae6f..28a26af8 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -150,8 +150,8 @@ TCP.IN.JMP.LISTEN TCP.IN.JMP.SYNSENT ldy #S.TCP.OPTIONS SYN Send, only accept SYN.ACK packet, then Send ACK lda (ZPFrameInPtr),y - cmp #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK - bne .8 + bit #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK + beq .8 jsr SKT.GetTCB @@ -462,6 +462,8 @@ TCP.OUT.SendOptA.1 bit #S.TCP.OPTIONS.ACK beq .10 +* pha + ldx #3 ldy #S.TCP.ACKNUM+3 @@ -471,10 +473,20 @@ TCP.OUT.SendOptA.1 dex bpl .1 -.10 ldx #3 +* pla + +.10 +* clc +* bit #S.TCP.OPTIONS.FIN +* beq .11 +* sec + +.11 ldx #3 ldy #S.TCP.SEQNUM+3 .2 lda SKT.TCBCache+S.TCB.OUTNEXTSEQ,x +* adc #0 +* sta SKT.TCBCache+S.TCB.OUTNEXTSEQ,x sta (ZPFrameOutPtr),y dey dex