From 167e9146c06f00d3a9eeb8d6d7fe7e3959fa07ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 11 Jun 2019 17:47:18 +0200 Subject: [PATCH] Kernel 0.93 --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes INC/LIBTCPIP.I.txt | 6 +- LIB/LIBTCPIP.S.SKT.txt | 382 +++++++++++++++++---------------------- LIB/LIBTCPIP.S.TCP.txt | 55 ++++-- LIB/LIBTCPIP.S.txt | 6 - 5 files changed, 212 insertions(+), 237 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 9e145c2ba23b565f0016f40b558ad229603019e7..85fbf30667671148d58d3096cccbf85471c29b95 100644 GIT binary patch delta 21577 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 Gi~kR0u*_fp delta 22945 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 diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 1785a972..45484cab 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -187,13 +187,13 @@ S.SOCKET.TCP.OUTFREE .EQ S.SOCKET+16 S.SOCKET.TCP.OUTTOSEND .EQ S.SOCKET+18 S.SOCKET.TCP.OUTUSED .EQ S.SOCKET+20 * -S.SOCKET.TCP.INLASTSEQNUM .EQ S.SOCKET+22 Recv:Last SEQ received from remote +S.SOCKET.TCP.INSEQNUM .EQ S.SOCKET+22 Recv:Last SEQ received from remote S.SOCKET.TCP.OUTSEQNUM .EQ S.SOCKET+26 Send:SEQ sent not yet ACKed (retransmit) S.SOCKET.TCP.OUTNEXTSEQ .EQ S.SOCKET+30 Send:Next SEQ to send -S.SOCKET.TCP.OUTACKNUM .EQ S.SOCKET+34 Send:ACK to send to remote +*S.SOCKET.TCP.OUTACKNUM .EQ S.SOCKET+34 Send:ACK to send to remote * -S.SOCKET.TCP .EQ S.SOCKET+38 +S.SOCKET.TCP .EQ S.SOCKET+34 *-------------------------------------- S.ARP.HTYPE .EQ S.ETH.EII+0 $0001 S.ARP.PTYPE .EQ S.ETH.EII+2 $0800 diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 0521ad37..841b4462 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -484,29 +484,112 @@ SKT.GetDataFromSktIn .8 >ADC16 SKT.Cache+S.SOCKET.TCP.INFREE,ZPDataInLen >SBC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPDataInLen - lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3 - clc - adc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3 - lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+2 - adc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM+2 +* lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3 +* clc +* adc ZPDataInLen +* sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM+3 +* lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM+2 +* adc ZPDataInLen+1 +* sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM+2 - bcc .80 - inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM+1 - bne .80 - inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM +* bcc .80 +* inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM+1 +* bne .80 +* inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM +*.80 + jsr SKT.StoreTCB -.80 jsr SKT.StoreTCB - - lda #S.TCP.OPTIONS.ACK - jsr TCP.OUT.SendOptA +* lda #S.TCP.OPTIONS.ACK +* jsr TCP.OUT.SendOptA -* jsr TCP.SetSocketTCPO.ACK + jsr TCP.SetSocketTCPO.ACK ACK=1 -> send WSIZE * jsr TCP.OUT.I SKT.GetTCB already called >LDYA ZPDataInLen + clc + rts +*-------------------------------------- +* From TCP.IN +* Src : ZPDataInPtr/ZPDataInLen +* Dst : hInMem/INHEAD +*-------------------------------------- +SKT.AddDataToSktIn + lda SKT.Cache+S.SOCKET.TCP.INFREE + sec + sbc ZPDataInLen + tax + lda SKT.Cache+S.SOCKET.TCP.INFREE+1 + sbc ZPDataInLen+1 + bcc .9 Not enough room in Q + + stx SKT.Cache+S.SOCKET.TCP.INFREE + sta SKT.Cache+S.SOCKET.TCP.INFREE+1 + + ldy #S.SOCKET.SQ.hInMem + lda (ZPPtrSKT),y + >SYSCALL2 GetMemPtr + >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base + + pha + tya +* clc + adc SKT.Cache+S.SOCKET.TCP.INHEAD + sta ZPTmpPtr2 + + pla + adc SKT.Cache+S.SOCKET.TCP.INHEAD+1 + sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail + + lda ZPDataInLen + eor #$FF + tax + + lda ZPDataInLen+1 + eor #$FF + pha + + ldy #0 + +.1 inx + bne .2 + pla + inc + beq .8 + + pha + +.2 lda (ZPDataInPtr),y + sta (ZPTmpPtr2) + iny + bne .3 + inc ZPDataInPtr+1 + +.3 inc SKT.Cache+S.SOCKET.TCP.INHEAD + bne .4 + + inc SKT.Cache+S.SOCKET.TCP.INHEAD+1 + lda SKT.Cache+S.SOCKET.TCP.INHEAD+1 + cmp /K.TCP.WSIZE + bne .4 + + stz SKT.Cache+S.SOCKET.TCP.INHEAD+1 + lda ZPTmpPtr1 Dst Ptr=Buffer Base + sta ZPTmpPtr2 + lda ZPTmpPtr1+1 + sta ZPTmpPtr2+1 + bra .1 + +.4 inc ZPTmpPtr2 + bne .1 + inc ZPTmpPtr2+1 + bra .1 + +.9 sec + rts + +.8 >ADC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPDataInLen + clc rts */-------------------------------------- @@ -609,9 +692,79 @@ SKT.AddDataToSktOut >ADC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataInLen jsr SKT.StoreTCB - jsr TCP.OUT.I SKT.GetTCB called, try to push, ignore error.... +* jsr TCP.OUT.I SKT.GetTCB called, try to push, ignore error.... >LDYA ZPDataInLen + clc + rts +*-------------------------------------- +* From TCP.OUT +* Src : hOutMem/OUTTAIL +* Dst : ZPDataOutPtr/ZPDataOutLen +*-------------------------------------- +SKT.GetDataFromSktOut + ldy #S.SOCKET.SQ.hOutMem + lda (ZPPtrSKT),y + + >SYSCALL2 GetMemPtr + >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base + + pha + tya +* clc + adc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT + sta ZPTmpPtr2 Make ZPTmpPtr2=base+nexttail + + pla + adc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 + sta ZPTmpPtr2+1 + + lda ZPDataOutLen + eor #$FF + tax + + lda ZPDataOutLen+1 + eor #$FF + pha + + ldy #0 + +.1 inx + bne .2 + pla + inc + beq .8 + + pha + +.2 lda (ZPTmpPtr2) + sta (ZPDataOutPtr),y + iny + bne .3 + inc ZPDataOutPtr+1 + +.3 inc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT + bne .4 + + inc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 + lda SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 + cmp /K.TCP.WSIZE + bne .4 + + stz SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 + lda ZPTmpPtr1 Dst Ptr=Buffer Base + sta ZPTmpPtr2 + lda ZPTmpPtr1+1 + sta ZPTmpPtr2+1 + bra .1 + +.4 inc ZPTmpPtr2 + bne .1 + inc ZPTmpPtr2+1 + bra .1 + +.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataOutLen + clc rts */-------------------------------------- @@ -1040,201 +1193,6 @@ SKT.AddToQueueA pha * sec rts *-------------------------------------- -* From TCP.IN -* Src : ZPDataInPtr/ZPDataInLen -* Dst : hInMem/INHEAD -*-------------------------------------- -SKT.AddDataToSktIn - .DO IPDEBUG=2 - ldx #3 -.91 lda SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x - >PUSHA - dex - bpl .91 - - ldy #S.TCP.SEQNUM+3 -.92 lda (ZPFrameInPtr),y - >PUSHA - dey - cpy #S.TCP.SEQNUM-1 - bne .92 - >PUSHBI 8 - >LDYA L.MSG.SEQNUM - >SYSCALL printf - .FIN - - lda SKT.Cache+S.SOCKET.TCP.INFREE - sec - sbc ZPDataInLen - tax - lda SKT.Cache+S.SOCKET.TCP.INFREE+1 - sbc ZPDataInLen+1 - bcc .9 Not enough room in Q - - stx SKT.Cache+S.SOCKET.TCP.INFREE - sta SKT.Cache+S.SOCKET.TCP.INFREE+1 - - ldy #S.TCP.SEQNUM+3 - ldx #3 - -.10 lda (ZPFrameInPtr),y - eor SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x - bne .9 - dey - dex - bpl .10 - - ldy #S.SOCKET.SQ.hInMem - lda (ZPPtrSKT),y - >SYSCALL2 GetMemPtr - >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base - - pha - tya -* clc - adc SKT.Cache+S.SOCKET.TCP.INHEAD - sta ZPTmpPtr2 - - pla - adc SKT.Cache+S.SOCKET.TCP.INHEAD+1 - sta ZPTmpPtr2+1 Make ZPTmpPtr2=base+Tail - - lda ZPDataInLen - eor #$FF - tax - - lda ZPDataInLen+1 - eor #$FF - pha - - ldy #0 - -.1 inx - bne .2 - pla - inc - beq .8 - - pha - -.2 lda (ZPDataInPtr),y - sta (ZPTmpPtr2) - iny - bne .3 - inc ZPDataInPtr+1 - -.3 inc SKT.Cache+S.SOCKET.TCP.INHEAD - bne .4 - - inc SKT.Cache+S.SOCKET.TCP.INHEAD+1 - lda SKT.Cache+S.SOCKET.TCP.INHEAD+1 - cmp /K.TCP.WSIZE - bne .4 - - stz SKT.Cache+S.SOCKET.TCP.INHEAD+1 - lda ZPTmpPtr1 Dst Ptr=Buffer Base - sta ZPTmpPtr2 - lda ZPTmpPtr1+1 - sta ZPTmpPtr2+1 - bra .1 - -.4 inc ZPTmpPtr2 - bne .1 - inc ZPTmpPtr2+1 - bra .1 - -.9 sec - rts - -.8 >ADC16 SKT.Cache+S.SOCKET.TCP.INUSED,ZPDataInLen - - clc - - lda SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+3 - adc ZPDataInLen - sta SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+3 - - lda SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+2 - adc ZPDataInLen+1 - sta SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+2 - bcc .81 - inc SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM+1 - bne .80 - inc SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM - -.80 clc -.81 rts -*-------------------------------------- -* From TCP.OUT -* Src : hOutMem/OUTTAIL -* Dst : ZPDataOutPtr/ZPDataOutLen -*-------------------------------------- -SKT.GetDataFromSktOut - ldy #S.SOCKET.SQ.hOutMem - lda (ZPPtrSKT),y - - >SYSCALL2 GetMemPtr - >STYA ZPTmpPtr1 Make ZPTmpPtr1=buffer base - - pha - tya -* clc - adc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT - sta ZPTmpPtr2 Make ZPTmpPtr2=base+nexttail - - pla - adc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 - sta ZPTmpPtr2+1 - - lda ZPDataOutLen - eor #$FF - tax - - lda ZPDataOutLen+1 - eor #$FF - pha - - ldy #0 - -.1 inx - bne .2 - pla - inc - beq .8 - - pha - -.2 lda (ZPTmpPtr2) - sta (ZPDataOutPtr),y - iny - bne .3 - inc ZPDataOutPtr+1 - -.3 inc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT - bne .4 - - inc SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 - lda SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 - cmp /K.TCP.WSIZE - bne .4 - - stz SKT.Cache+S.SOCKET.TCP.OUTTAILNEXT+1 - lda ZPTmpPtr1 Dst Ptr=Buffer Base - sta ZPTmpPtr2 - lda ZPTmpPtr1+1 - sta ZPTmpPtr2+1 - bra .1 - -.4 inc ZPTmpPtr2 - bne .1 - inc ZPTmpPtr2+1 - bra .1 - -.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataOutLen - - clc - rts -*-------------------------------------- SKT.NewTCB ldx #S.SOCKET.TCP.INTAIL .1 stz SKT.Cache,x diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 2852b8f4..0a0c86dc 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -199,18 +199,41 @@ TCP.IN.JMP.ESTBLSH lda ZPDataInLen Incoming Data in this frame ? ora ZPDataInLen+1 - beq .5 No data, ... + beq .7 No data, ... + + ldy #S.TCP.SEQNUM+3 + ldx #3 + +.5 lda (ZPFrameInPtr),y + eor SKT.Cache+S.SOCKET.TCP.INSEQNUM,x + bne .7 + dey + dex + bpl .5 jsr SKT.AddDataToSktIn yes, queue data if there is room for.... - bcs .5 + bcs .7 - jsr SKT.StoreTCB success, update socket + lda SKT.Cache+S.SOCKET.TCP.INSEQNUM+3 +* clc + adc ZPDataInLen + sta SKT.Cache+S.SOCKET.TCP.INSEQNUM+3 -* jsr TCP.SetSocketTCPO.ACK Try to ACK read DATA + lda SKT.Cache+S.SOCKET.TCP.INSEQNUM+2 + adc ZPDataInLen+1 + sta SKT.Cache+S.SOCKET.TCP.INSEQNUM+2 + bcc .6 + inc SKT.Cache+S.SOCKET.TCP.INSEQNUM+1 + bne .6 + inc SKT.Cache+S.SOCKET.TCP.INSEQNUM + +.6 jsr SKT.StoreTCB success, update socket + + jsr TCP.SetSocketTCPO.ACK Try to ACK read DATA * jsr TCP.OUT.I SKT.GetTCB already called -.5 ldy #S.TCP.OPTIONS +.7 ldy #S.TCP.OPTIONS lda (ZPFrameInPtr),y and #S.TCP.OPTIONS.FIN beq .8 @@ -315,8 +338,8 @@ TCP.IN.ACKTheSYN .3 lda (ZPFrameInPtr),y Set OUTACK=SEQ+1 for new socket... adc #0 - sta SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x - sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x + sta SKT.Cache+S.SOCKET.TCP.INSEQNUM,x +* sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x dey dex bpl .3 @@ -327,17 +350,17 @@ TCP.IN.ACKTheFIN ldx #3 -.1 inc SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x - bne .2 +.1 inc SKT.Cache+S.SOCKET.TCP.INSEQNUM,x + bne .8 dex bpl .1 -.2 ldx #3 +*.2 ldx #3 -.3 inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x - bne .8 - dex - bpl .3 +*.3 inc SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x +* bne .8 +* dex +* bpl .3 .8 rts *-------------------------------------- @@ -483,7 +506,7 @@ TCP.OUT.I lda SKT.Cache+S.SOCKET.TCP.OUTTOSEND+1 lda #S.TCP.OPTIONS.ACK+S.TCP.OPTIONS.PSH - jsr TCP.SetSocketTCPO +* jsr TCP.SetSocketTCPO jsr TCP.OUT.Send @@ -523,7 +546,7 @@ TCP.OUT.Send ldy #S.TCP.OPTIONS ldx #3 ldy #S.TCP.ACKNUM+3 -.1 lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x +.1 lda SKT.Cache+S.SOCKET.TCP.INSEQNUM,x sta (ZPFrameOutPtr),y dey dex diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index b507f469..b17b0920 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -161,9 +161,6 @@ J.SKT.send .DA SKT.send.RAW .DO IPDEBUG=1 L.MSG.FRM.Dump .DA MSG.FRM.Dump L.MSG.SKT.Dump .DA MSG.SKT.Dump - .FIN - .DO IPDEBUG=2 -L.MSG.SEQNUM .DA MSG.SEQNUM .FIN .DA 0 *-------------------------------------- @@ -466,9 +463,6 @@ IP.ID .BS 2 MSG.FRM.Dump .AZ "FRM:SRC=%d.%d.%d.%d:%D DST=%d.%d.%d.%d:%D\r\n" MSG.SKT.Dump .AZ "SKT:LOC=%d.%d.%d.%d:%D REM=%d.%d.%d.%d:%D\r\n" .FIN - .DO IPDEBUG=2 -MSG.SEQNUM .AZ "FRM:%h%h%h%h,SKT:%h%h%h%h\r\n" - .FIN *-------------------------------------- MAN SAVE USR/SRC/LIB/LIBTCPIP.S