From ee7b6066127150bf14e39f76b8ca79d24253f2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 19 May 2021 14:44:47 +0200 Subject: [PATCH] Kernel 0.94++ --- .Docs/LIBTCPIP.md | 74 +++-- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/ASM.S.txt | 1 + BIN/CMP.S.txt | 3 +- BIN/FORTH.S.CP.txt | 2 +- BIN/FORTH.S.KW.txt | 6 +- BIN/FORTH.S.txt | 4 +- BIN/HTTPGET.S.txt | 15 +- BIN/IPCONFIG.S.DHCP.txt | 64 ++-- BIN/IPCONFIG.S.ETC.txt | 47 ++- BIN/IPCONFIG.S.txt | 66 ++-- BIN/IRC.S.txt | 18 +- BIN/NTPDATE.S.txt | 15 +- BIN/PING.S.txt | 11 +- BIN/TELNET.S.txt | 52 ++- BIN/TERM.S.txt | 66 ++-- BIN/WC.S.txt | 29 +- INC/MACROS.I.txt | 10 +- LIB/LIBCIFS.S.IO.txt | 571 ++++++++++++++++++++++++++++++++ LIB/LIBCIFS.S.txt | 684 ++++++--------------------------------- LIB/LIBETALK.S.AARP.txt | 5 +- LIB/LIBETALK.S.CFG.txt | 5 +- LIB/LIBETALK.S.DDP.txt | 5 +- LIB/LIBETALK.S.ELAP.txt | 5 +- LIB/LIBETALK.S.FRM.txt | 6 +- LIB/LIBETALK.S.RTMP.txt | 5 +- LIB/LIBETALK.S.txt | 26 +- LIB/LIBTCPIP.S.ARP.txt | 25 +- LIB/LIBTCPIP.S.CFG.txt | 5 +- LIB/LIBTCPIP.S.DNS.txt | 41 ++- LIB/LIBTCPIP.S.FRM.txt | 19 +- LIB/LIBTCPIP.S.HST.txt | 3 +- LIB/LIBTCPIP.S.ICMP.txt | 7 +- LIB/LIBTCPIP.S.IP.txt | 3 +- LIB/LIBTCPIP.S.SKT.txt | 156 +++++---- LIB/LIBTCPIP.S.TCP.txt | 35 +- LIB/LIBTCPIP.S.txt | 19 +- SBIN/CIFSD.S.txt | 18 +- SBIN/GETTY.S.txt | 14 +- SBIN/HTTPD.S.txt | 207 ++++++------ SBIN/TELNETD.S.txt | 12 +- SYS/KERNEL.S.BLISTX.txt | 3 + SYS/KERNEL.S.DEV.txt | 62 ++-- SYS/KERNEL.S.MEM.txt | 2 +- SYS/KERNEL.S.PIPE.txt | 5 +- SYS/KERNEL.S.SOCK.txt | 52 +++ SYS/KERNEL.S.STDIO.txt | 30 +- SYS/KERNEL.S.UNISTD.txt | 90 ++---- SYS/KERNEL.S.txt | 1 + 49 files changed, 1382 insertions(+), 1222 deletions(-) create mode 100644 LIB/LIBCIFS.S.IO.txt create mode 100644 SYS/KERNEL.S.SOCK.txt diff --git a/.Docs/LIBTCPIP.md b/.Docs/LIBTCPIP.md index 6744dcfd..56e36ff7 100644 --- a/.Docs/LIBTCPIP.md +++ b/.Docs/LIBTCPIP.md @@ -5,9 +5,9 @@ Copyright 2015 - 2020, Remy Gibert and the A2osX contributors. # ARP.Clear Clear ARP Cache -**In:** +**In:** -## RETURN VALUE +## RETURN VALUE # ARP.Query Query ARP Cache and returns HW address @@ -17,7 +17,7 @@ Copyright 2015 - 2020, Remy Gibert and the A2osX contributors. ## RETURN VALUE CC: hit: MAC filled - CS: missed + CS: missed # ARP.Add Add a static ARP cache record @@ -34,19 +34,19 @@ Copyright 2015 - 2020, Remy Gibert and the A2osX contributors. # DNS.Clear Clear DNS Cache -**In:** +**In:** -## RETURN VALUE +## RETURN VALUE # DNS.Query Query DNS for specified host **In:** PUSHW = PTR to IP to fill with cached data -* PUSHW = hostname PTR to PSTR +* PUSHW = hostname PTR to PSTR ## RETURN VALUE CC: hit: IP filled with address - CS: missed + CS: missed # DNS.Add Add a static DNS record @@ -69,8 +69,8 @@ Create a new socket ## ASM **In:** +`>PUSHB type` `>PUSHB protocol` -`lda type` `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` ## RETURN VALUE @@ -85,8 +85,8 @@ bind a name to a socket ## ASM **In:** +`>PUSHB fd` `>PUSHW addr` -`lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` ## RETURN VALUE @@ -101,8 +101,8 @@ Initiate a connection on a socket ## ASM **In:** +`>PUSHB fd` `>PUSHW addr` -`lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` ## RETURN VALUE @@ -157,9 +157,9 @@ Close socket ## ASM **In:** -`>PUSHWI count` +`>PUSHB fd` `>PUSHW buf` -`lda fd` +`>PUSHW count` `>LIBCALL hLIBTCPIP,LIBTCPIP.read` ## RETURN VALUE @@ -173,26 +173,37 @@ CS: A = EC ## ASM **In:** -`>PUSHWI count` +`>PUSHB fd` `>PUSHW buf` -`lda fd` +`>PUSHW count` `>LIBCALL hLIBTCPIP,LIBTCPIP.write` ## RETURN VALUE CC: Y,A = bytes written CS: A = EC -# Recv (RAW,DGRAM,SEQPKT) - # RecvFrom (RAW,DGRAM,SEQPKT) ## C -`hMem recv(hFD fd);` `hMem recvfrom(hFD fd, struct sockaddr *addr);` ## ASM **In:** +`>PUSHB fd` `>PUSHW addr` (RecvFrom) +`>LIBCALL hLIBTCPIP,LIBTCPIP.Recv` + +## RETURN VALUE +CC: A = hMem +CS: A = EC + +# Recv (RAW,DGRAM,SEQPKT) + +## C +`hMem recv(hFD fd);` + +## ASM +**In:** `lda fd` `>LIBCALL hLIBTCPIP,LIBTCPIP.Recv` @@ -200,20 +211,33 @@ CS: A = EC CC: A = hMem CS: A = EC -# Send (RAW,DGRAM,SEQPKT) - # SendTo (RAW,DGRAM,SEQPKT) ## C -`int skt.send(hFD fd, const void *buf, int count);` `int skt.sendto(hFD fd, const void *buf, int count, const struct sockaddr *addr);` ## ASM **In:** -`>PUSHW addr` (SendTo) -`>PUSHWI count` +`>PUSHB fd` `>PUSHW buf` -`lda fd` +`>PUSHWI count` +`>PUSHW addr` +`>LIBCALL hLIBTCPIP,LIBTCPIP.sendto` + +## RETURN VALUE +CC: Y,A = bytes written +CS: A = EC + +# Send (RAW,DGRAM,SEQPKT) + +## C +`int skt.send(hFD fd, const void *buf, int count);` + +## ASM +**In:** +`>PUSHB fd` +`>PUSHW buf` +`>PUSHWI count` `>LIBCALL hLIBTCPIP,LIBTCPIP.send` ## RETURN VALUE @@ -241,8 +265,8 @@ Set Socket Options ## ASM **In:** -`>PUSHBI opts` -`lda fd` +`>PUSHB fd` +`>PUSHB opts` `>LIBCALL hLIBTCPIP,LIBTCPIP.SetSockOpt` ## RETURN VALUE diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index d32b6355a4e484ae2f4b8883ef59494ee21f6bdc..779088780837d0d39ed37d44e8071cc98ec9128f 100644 GIT binary patch delta 149715 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

Gs!N1WfHRGZYSFwRV1|iXWb}s!nM%)wX>jQ~ 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 PeC7*Z18ald0ujFhX_NTz delta 148553 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 diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 2c5afa08..6e61fa18 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -244,6 +244,7 @@ CS.RUN.LOOP ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs .99 + tay bne .13 diff --git a/BIN/CMP.S.txt b/BIN/CMP.S.txt index 6c7fd739..02514cb0 100644 --- a/BIN/CMP.S.txt +++ b/BIN/CMP.S.txt @@ -341,8 +341,7 @@ MSG.DIFF .AZ "%H%h:%h %h\r\n" .DUMMY .OR 0 DS.START -DS.END - .ED +DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/cmp.s diff --git a/BIN/FORTH.S.CP.txt b/BIN/FORTH.S.CP.txt index 41eca26c..92ee9073 100644 --- a/BIN/FORTH.S.CP.txt +++ b/BIN/FORTH.S.CP.txt @@ -55,7 +55,7 @@ CP.PRINT ldy #$ff inc ZPCLBufPtr+1 .3 pla - clc + sec include \0 adc ZPDataPtr sta ZPDataPtr bcc .4 diff --git a/BIN/FORTH.S.KW.txt b/BIN/FORTH.S.KW.txt index 1b6e6d13..0cb69a2e 100644 --- a/BIN/FORTH.S.KW.txt +++ b/BIN/FORTH.S.KW.txt @@ -588,8 +588,7 @@ KW.NEGATIVE inc pStack *-------------------------------------- KW.ZERO clc - ldy #1 - lda (pStack),y + >PULLA ora (pStack) bne .9 @@ -598,7 +597,6 @@ KW.ZERO clc .9 lda #0 ror - inc pStack sta (pStack) * clc @@ -703,7 +701,7 @@ KW.PRINT >LDYAI 256 sta (ZPPtr1),y eor #'" bne .1 - + sec .2 sta (ZPPtr1),y diff --git a/BIN/FORTH.S.txt b/BIN/FORTH.S.txt index 5fb9009c..0b84a036 100644 --- a/BIN/FORTH.S.txt +++ b/BIN/FORTH.S.txt @@ -1048,12 +1048,12 @@ CODE.RPDROP2.L .EQ *-CODE.RPDROP2 *-------------------------------------- CODE.TESTTRUE >PULLA tax -.1 bpl .1+5 +.1 bmi .1+5 CODE.TESTTRUE.L .EQ *-CODE.TESTTRUE *-------------------------------------- CODE.TESTFALSE >PULLA tax -.1 bmi .1+5 +.1 bpl .1+5 CODE.TESTFALSE.L .EQ *-CODE.TESTFALSE *-------------------------------------- CODE.PULLA >PULLA diff --git a/BIN/HTTPGET.S.txt b/BIN/HTTPGET.S.txt index 6287e522..71a685af 100644 --- a/BIN/HTTPGET.S.txt +++ b/BIN/HTTPGET.S.txt @@ -240,15 +240,15 @@ CS.RUN.ARGSOK >PUSHW L.MSG.CONNECT >PUSHBI 8 >SYSCALL PrintF -CS.RUN.OPENSKT >PUSHBI 0 no protocol - lda #S.SOCKET.T.SEQPKT +CS.RUN.OPENSKT >PUSHBI S.SOCKET.T.SEQPKT + >PUSHBI 0 no protocol >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket + >PUSHB hSocket >PUSHW L.SA.LOCAL - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcc .1 @@ -263,8 +263,8 @@ CS.RUN.OPENSKT >PUSHBI 0 no protocol .2 >SLEEP + >PUSHB hSocket >PUSHW L.SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc .3 @@ -463,10 +463,11 @@ CS.RUN.REQUEST jsr Init.TimeOut >SYSCALL SPrintF bcs .90 - >PUSHYA Byte count + pha + >PUSHB hSocket >PUSHW ZPSendBufPtr - - lda hSocket + pla + >PUSHYA Byte count >LIBCALL hLIBTCPIP,LIBTCPIP.Send .90 php diff --git a/BIN/IPCONFIG.S.DHCP.txt b/BIN/IPCONFIG.S.DHCP.txt index 40858165..b0436740 100644 --- a/BIN/IPCONFIG.S.DHCP.txt +++ b/BIN/IPCONFIG.S.DHCP.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- DHCP.INIT lda IPCFG+S.NETCFG.STATUS and #S.IPCFG.STATUS.OK @@ -9,7 +8,7 @@ DHCP.INIT lda IPCFG+S.NETCFG.STATUS stz IPCFG+S.NETCFG.STATUS ldx #3 - + .1 eor A2osX.TIMER16,x sta DHCP.DISC.XID,x sta DHCP.REQ.XID,x @@ -34,42 +33,43 @@ DHCP.INIT lda IPCFG+S.NETCFG.STATUS sec rts *-------------------------------------- -DHCP.RUN >PUSHBI 0 no protocol - lda #S.SOCKET.T.DGRAM +DHCP.RUN >PUSHBI S.SOCKET.T.DGRAM + >PUSHBI 0 no protocol >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcc .1 .9 jmp DHCP.RUN.KO .1 sta hSocket - pha + >PUSHA >PUSHW L.SA.LOCAL - pla >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 >SLEEP - >PUSHWI S.SOCKET.O.BROADCAST - lda hSocket + >PUSHB hSocket + >PUSHBI S.SOCKET.O.BROADCAST >LIBCALL hLIBTCPIP,LIBTCPIP.setsockopt + + >PUSHB hSocket >PUSHW L.SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcs .9 >LDYA L.MSG.DHCP.CFG1 >SYSCALL PutS - + >SLEEP -DHCP.RUN.SDISC >PUSHW L.SA.DEST - >PUSHWI DHCP.DISC.LEN +DHCP.RUN.SDISC >PUSHB hSocket >PUSHW L.DHCP.DISC - lda hSocket + >PUSHWI DHCP.DISC.LEN + >PUSHW L.SA.DEST >LIBCALL hLIBTCPIP,LIBTCPIP.SendTo bcc .1 + jmp DHCP.RUN.KO .1 lda #S.IPCFG.STATUS.SDISC @@ -77,15 +77,15 @@ DHCP.RUN.SDISC >PUSHW L.SA.DEST DHCP.RUN.ROFFER jsr DHCP.RUN.SKT.RECV bcc .1 - + lda #1 jmp DHCP.RUN.KO - + .1 jsr CheckDHCPOffer bcs DHCP.RUN.ROFFER lda #S.IPCFG.STATUS.ROFFER sta IPCFG - + DHCP.RUN.SREQ >PUSHW L.MSG.DHCP.CFG2 ldx #0 @@ -97,19 +97,19 @@ DHCP.RUN.SREQ >PUSHW L.MSG.DHCP.CFG2 >PUSHBI 4 >SYSCALL PrintF - >PUSHW L.SA.DEST - >PUSHWI DHCP.REQ.LEN + >PUSHB hSocket >PUSHW L.DHCP.REQ - lda hSocket + >PUSHWI DHCP.REQ.LEN + >PUSHW L.SA.DEST >LIBCALL hLIBTCPIP,LIBTCPIP.SendTo bcs DHCP.RUN.KO lda #S.IPCFG.STATUS.SREQ sta IPCFG - + DHCP.RUN.RACK jsr DHCP.RUN.SKT.RECV bcc .1 - + lda #2 bra DHCP.RUN.KO @@ -122,7 +122,7 @@ DHCP.RUN.OK lda #S.IPCFG.STATUS.OK >LIBCALL hLIBTCPIP,LIBTCPIP.SETCFG >PUSHW L.MSG.DHCP.OK - + ldx #0 .1 lda IPCFG+S.IPCFG.IP,x @@ -130,7 +130,7 @@ DHCP.RUN.OK lda #S.IPCFG.STATUS.OK inx cpx #4 bne .1 - + ldx #0 .2 lda IPCFG+S.IPCFG.MASK,x @@ -138,7 +138,7 @@ DHCP.RUN.OK lda #S.IPCFG.STATUS.OK inx cpx #4 bne .2 - + >PUSHBI 8 >SYSCALL PrintF @@ -162,20 +162,20 @@ DHCP.RUN.SKT.RECV sta TimeOut .1 >SLEEP - + lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .8 - + cmp #E.NODATA bne .9 - + lda TimeOut bne .1 - + .9 sec rts - + .8 sta hFrame >SYSCALL GetMemPtr @@ -194,7 +194,7 @@ CheckDHCPOffer jsr CheckDHCPXID bcs .9 lda ZPFrameBase - clc + clc adc #S.DHCP.OPTIONS sta ZPFramePtr @@ -322,7 +322,7 @@ GetDHCPOption cmp #S.DHCP.OPTIONS.MASK sta IPCFG+S.IPCFG.DOMAIN-1,y dex bne .7 - + .9 rts *-------------------------------------- GetDHCPOption.CopyIP @@ -350,7 +350,7 @@ CheckDHCPAck jsr CheckDHCPXID bcs .9 lda ZPFrameBase - clc + clc adc #S.DHCP.OPTIONS sta ZPFramePtr diff --git a/BIN/IPCONFIG.S.ETC.txt b/BIN/IPCONFIG.S.ETC.txt index 0e30a203..b4d40a51 100644 --- a/BIN/IPCONFIG.S.ETC.txt +++ b/BIN/IPCONFIG.S.ETC.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- ETC.ReadFiles >LDYAI 256 >SYSCALL GetMem @@ -20,7 +19,7 @@ ETC.ReadFiles >LDYAI 256 >PUSHW A2osX.TIMER16 >PUSHBI 2 >SYSCALL SPrintF - + .4 >LDYA L.TCPIP.CONF jsr CFG.Read.PrintF jsr CFG.Read.TCPIP.CONF @@ -80,25 +79,25 @@ CFG.Read.TCPIP.CONF jsr CFG.Read.Open jsr CFG.Read.Result bcs .9 - + .1 jsr CFG.Read.GetS bcs .8 - + lda (ZPTmpPtr1) beq .1 empty line... - + cmp #'#' beq .1 comment... - + ldy #$ff .2 iny lda (ZPTmpPtr1),y beq .3 - + cmp #C.SPACE bne .2 - + .3 lda L.CFG.Keywords sta ZPTmpPtr2 lda L.CFG.Keywords+1 @@ -111,36 +110,36 @@ CFG.Read.TCPIP.CONF tya cmp (ZPTmpPtr2) bne .6 - + .5 lda (ZPTmpPtr2),y dey cmp (ZPTmpPtr1),y bne .6 - + tya bne .5 - + ply discard keyword len - + jsr .80 bra .1 - + .6 lda (ZPTmpPtr2) sec adc ZPTmpPtr2 sta ZPTmpPtr2 bcc .7 - + inc ZPTmpPtr2+1 - + .7 inx inx ply reset keyword len lda (ZPTmpPtr2) bne .4 - + bra .1 - + .8 clc .HS B0 BCS .9 sec @@ -161,14 +160,14 @@ CFG.Read.nameserver ldx #S.IPCFG.DNS1 lda IPCFG,x beq CFG.Read.IP - + ldx #S.IPCFG.DNS2 lda IPCFG,x beq CFG.Read.IP - + clc rts - + CFG.Read.IP lda (ZPTmpPtr2) sec adc ZPTmpPtr1 @@ -229,7 +228,7 @@ CFG.Read.HOSTS stz CFG.hBuf2 >STYA ZPTmpPtr2 stx CFG.hBuf2 - + >LDYAI 256 >SYSCALL GetMem bcs .9 @@ -292,12 +291,12 @@ CFG.Read.HOSTS.Scan inx cpx #4 bne .2 - + >PUSHW ZPTmpPtr2 >PUSHW ZPTmpPtr3 - + >PUSHBI 12 6 PTRs on stack - + >SYSCALL SScanF rts *-------------------------------------- diff --git a/BIN/IPCONFIG.S.txt b/BIN/IPCONFIG.S.txt index 0857b4ec..085baf85 100644 --- a/BIN/IPCONFIG.S.txt +++ b/BIN/IPCONFIG.S.txt @@ -139,7 +139,7 @@ CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG lda #MLI.E.NODEV sec rts -CS.RUN.SETUP +CS.RUN.SETUP .1 inc ArgIndex lda ArgIndex >SYSCALL ArgV @@ -150,14 +150,14 @@ CS.RUN.SETUP cmp #'-' bne .99 - ldy #1 + ldy #1 lda (ZPTmpPtr1),y ldx #OptionVars-OptionList-1 - + .2 cmp OptionList,x beq .3 - + dex bpl .2 @@ -208,7 +208,7 @@ CS.RUN.SETUP CS.RUN.DUMP >PUSHB IPCFG+S.NETCFG.DevID >PUSHEA.G DIB >SYSCALL GetDevStatus - + >LEA.G DCB.NIC >STYA.G IOCTL+S.IOCTL.BUFPTR lda #S.IOCTL.S.GETDCB @@ -233,33 +233,33 @@ CS.RUN.DUMPNIC >PUSHW L.MSG1.DEV adc /S.FD.DEV >PUSHYA - >PUSHEA.G DIB+S.DIB.IDS + >PUSHEA.G DIB+S.DIB.IDS ldy #DCB.NIC+S.DCB.NIC.MAC ldx #6 .1 lda (pData),y >PUSHA iny - dex + dex bne .1 >PUSHBI 11 - + >SYSCALL PrintF >PUSHW L.MSG1.DEV.ARP - + >LDA.G DCB.NIC+S.DCB.NIC.FLAGS and #S.DCB.NIC.FLAGS.ARPOFFLOAD beq .2 lda #1 .2 >PUSHA - >PUSHBI 1 - + >PUSHBI 1 + >SYSCALL PrintF - + >PUSHW L.MSG1.DEV.IP - + >LDA.G DCB.NIC+S.DCB.NIC.FLAGS and #S.DCB.NIC.FLAGS.IPOFFLOAD @@ -267,9 +267,9 @@ CS.RUN.DUMPNIC >PUSHW L.MSG1.DEV lda #1 .3 - >PUSHA - >PUSHBI 1 - + >PUSHA + >PUSHBI 1 + >SYSCALL PrintF >LDA.G DCB.NIC+S.DCB.NIC.LINK @@ -281,11 +281,11 @@ CS.RUN.DUMPNIC >PUSHW L.MSG1.DEV CS.RUN.LINK >LDYA L.MSG1.LINK.OK >SYSCALL PutS - + >PUSHW L.MSG1.LINKSPEED >PUSHBI 0 >SYSCALL PrintF - + >LDA.G DCB.NIC+S.DCB.NIC.SPEED and #$0F tax @@ -316,30 +316,30 @@ CS.RUN.DUMPIP >PUSHW L.MSG2 .10 >SYSCALL PutS >PUSHW L.MSG2.DHCPSRVR - + ldx #0 .2 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x inx cpx #4 bne .2 - + >PUSHBI 4 - + >SYSCALL PrintF - + >PUSHW L.MSG2.IPMASK - + ldx #0 IP/MASK .3 >PUSHB IPCFG+S.IPCFG.IP,x inx cpx #8 bne .3 >PUSHBI 8 - + >SYSCALL PrintF - + >PUSHW L.MSG2.GW - + ldx #0 .4 >PUSHB IPCFG+S.IPCFG.GW,x inx @@ -347,25 +347,25 @@ CS.RUN.DUMPIP >PUSHW L.MSG2 bne .4 >PUSHBI 4 >SYSCALL PrintF - + >PUSHW L.MSG2.DNS - + ldx #0 .5 >PUSHB IPCFG+S.IPCFG.DNS1,x inx cpx #8 bne .5 >PUSHBI 8 - + >SYSCALL PrintF - + >PUSHW L.MSG2.HOSTNAME >PUSHW L.IPCFG.HOSTNAME >PUSHW L.IPCFG.DOMAIN - + >PUSHBI 4 >SYSCALL PrintF - lda #0 tell TSKMGR that all done ok, but + lda #0 tell TSKMGR that all done ok, but sec we do not want to stay in memory rts *-------------------------------------- @@ -478,7 +478,7 @@ DHCP.DISC.XID .BS 4 .HS 00000000 CIADDR DHCP.DISC.YIADDR .HS 00000000 .HS 00000000 SIADDR -DHCP.DISC.GIADDR .HS 00000000 +DHCP.DISC.GIADDR .HS 00000000 DHCP.DISC.CHADDR .HS 00000000.00000000.00000000.00000000 .BS 64 SNAME .BS 128 FILE diff --git a/BIN/IRC.S.txt b/BIN/IRC.S.txt index e8d586ee..1c0f7fa4 100644 --- a/BIN/IRC.S.txt +++ b/BIN/IRC.S.txt @@ -263,15 +263,15 @@ CS.RUN.CheckArgs >SYSCALL PrintF rts *-------------------------------------- -CS.RUN.Connect >PUSHBI 0 no protocol - lda #S.SOCKET.T.STREAM +CS.RUN.Connect >PUSHBI S.SOCKET.T.STREAM + >PUSHBI 0 no protocol >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket + >PUSHA >PUSHW L.SA.LOCAL - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 @@ -280,8 +280,8 @@ CS.RUN.Connect >PUSHBI 0 no protocol .1 >SLEEP + >PUSHB hSocket >PUSHW L.SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc .8 @@ -370,9 +370,9 @@ CS.RUN.GetMsg bit bPendingMsg .10 ldy BufLen bne .2 -.1 >PUSHWI 255 +.1 >PUSHB hSocket >PUSHW ZPBufPtr - lda hSocket + >PUSHWI 255 >LIBCALL hLIBTCPIP,LIBTCPIP.Read bcs .7 @@ -700,9 +700,11 @@ CS.RUN.DUMPMSG >PUSHW L.SEQ.DUMPMSG >SYSCALL PrintF rts *-------------------------------------- -CS.RUN.SendMsg >PUSHYA +CS.RUN.SendMsg pha + >PUSHB hSocket >PUSHW ZPRespPtr - lda hSocket + pla + >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.Write rts *-------------------------------------- diff --git a/BIN/NTPDATE.S.txt b/BIN/NTPDATE.S.txt index 5e6382f8..426ff73d 100644 --- a/BIN/NTPDATE.S.txt +++ b/BIN/NTPDATE.S.txt @@ -204,7 +204,7 @@ CheckArgs.A lda iArg >SYSCALL AToL >PUSHWI 0 >PUSHWI 3600 - >FPU IMUL32 + >FPU uMUL >PULLL Adjust clc @@ -264,20 +264,20 @@ OpenSocket >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? sec rts -.3 >PUSHBI S.IP.PROTOCOL.UDP - lda #S.SOCKET.T.DGRAM +.3 >PUSHBI S.SOCKET.T.DGRAM + >PUSHBI S.IP.PROTOCOL.UDP >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket + >PUSHA >PUSHW L.SA.LOCAL - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 + >PUSHB hSocket >PUSHW L.SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc .8 @@ -289,10 +289,9 @@ OpenSocket >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? sec .8 rts *-------------------------------------- -SendNTPRequest >PUSHWI NTP.Request.End-NTP.Request +SendNTPRequest >PUSHB hSocket >PUSHW L.NTP.Request - - lda hSocket + >PUSHWI NTP.Request.End-NTP.Request >LIBCALL hLIBTCPIP,LIBTCPIP.Send bcs .9 diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index 49d9ec73..f04bacca 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -191,20 +191,20 @@ CS.RUN.OPENSKT ldx #3 >STA.G SA.REMOTE+S.SOCKADDR.PORT+1 sta Identifier+1 + >PUSHBI S.SOCKET.T.RAW >PUSHBI S.IP.PROTOCOL.ICMP - lda #S.SOCKET.T.RAW >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket + >PUSHB hSocket >PUSHEA.G SA.LOCAL - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 + >PUSHB hSocket >PUSHEA.G SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc CS.RUN.SEND.ECHO @@ -236,10 +236,9 @@ CS.RUN.SEND.ECHO dey sta (pData),y - >PUSHWI ICMP.RequestLen + >PUSHB hSocket >PUSHW pData - lda hSocket - + >PUSHWI ICMP.RequestLen >LIBCALL hLIBTCPIP,LIBTCPIP.Send bcs CS.RUN.ERR diff --git a/BIN/TELNET.S.txt b/BIN/TELNET.S.txt index 76824fb2..84545a02 100644 --- a/BIN/TELNET.S.txt +++ b/BIN/TELNET.S.txt @@ -41,7 +41,7 @@ CS.START cld *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN - .DA CS.DOEVENT + .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SA.LOCAL .DA SA.LOCAL @@ -69,7 +69,7 @@ CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi CS.RUN.IPOK - + >LDYA L.MSG.IPKO >SYSCALL PutS lda #E.SYN @@ -92,7 +92,7 @@ CS.RUN.IPOK ldy #S.PS.ARGC sta TimeOut .2 >SLEEP - + >PUSHW L.SA.REMOTE.AD lda #1 >SYSCALL ArgV @@ -135,19 +135,19 @@ CS.RUN.PORTOK >PUSHW L.MSG.HOSTOK lda #1 >SYSCALL ArgV >PUSHYA - + >PUSHBI 8 >SYSCALL PrintF - -CS.RUN.OPENSKT >PUSHBI 0 no protocol - lda #S.SOCKET.T.STREAM + +CS.RUN.OPENSKT >PUSHBI S.SOCKET.T.STREAM + >PUSHBI 0 no protocol >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket + >PUSHA >PUSHW L.SA.LOCAL - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcc .2 @@ -162,29 +162,29 @@ CS.RUN.OPENSKT >PUSHBI 0 no protocol sta TimeOut .3 >SLEEP - + + >PUSHB hSocket >PUSHW L.SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc .4 - + cmp #ERR.SKT.NOCONN bne .9 - + lda TimeOut bne .3 - + lda #ERR.SKT.NOCONN bra .9 - + .4 >PUSHW L.MSG.SKTOK >PUSHBI 0 >SYSCALL PrintF - + >LDYAI BUFSIZE >SYSCALL GetMem bcs .99 - + >STYA ZPBufPtr stx hBuf @@ -197,23 +197,20 @@ CS.RUN.LOOP >SLEEP tay bne .2 EOF, no char - >PUSHWI BUFSIZE + >PUSHB hSocket >PUSHW ZPBufPtr - lda hSocket + >PUSHWI BUFSIZE >LIBCALL hLIBTCPIP,LIBTCPIP.Read .98 bcs .99 - pha - phy - + >STYA ZPBufLen + ldy #S.PS.hStdOut lda (pPS),y >PUSHA >PUSHW ZPBufPtr - ply - pla - >PUSHYA len + >PUSHW ZPBufLen >SYSCALL FWrite bcs .11 @@ -229,7 +226,7 @@ CS.RUN.LOOP >SLEEP lda (pPS),y >PUSHA >PUSHW ZPBufPtr - >PUSHWI BUFSIZE + >PUSHWI BUFSIZE >SYSCALL FRead .11 bcc .3 @@ -237,13 +234,14 @@ CS.RUN.LOOP >SLEEP .99 bra CS.RUN.SKTERR .3 >STYA ZPBufLen + lda (ZPBufPtr) cmp #$14 Ctrl-T beq CS.RUN.USER - >PUSHW ZPBufLen + >PUSHB hSocket >PUSHW ZPBufPtr - lda hSocket + >PUSHW ZPBufLen >LIBCALL hLIBTCPIP,LIBTCPIP.Write .9 bcs CS.RUN.SKTERR diff --git a/BIN/TERM.S.txt b/BIN/TERM.S.txt index 2b4aea2c..dae81213 100644 --- a/BIN/TERM.S.txt +++ b/BIN/TERM.S.txt @@ -15,6 +15,7 @@ BUFSIZE .EQ 256 .OR ZPBIN ZS.START ZPBufPtr .BS 2 +ZPDataLen .BS 2 hBuf .BS 1 hDev .BS 1 TimeOut .BS 1 @@ -81,27 +82,19 @@ CS.RUN.LOOP >SLEEP lda hDev >SYSCALL FEOF - bcs CS.RUN.RTS + bcs .9 tay bne .1 EOF, no char - >PUSHB hDev - >PUSHW ZPBufPtr - >PUSHWI BUFSIZE - >SYSCALL FRead + lda hDev + jsr CS.Read bcs CS.RUN.RTS - pha - phy + >STYA ZPDataLen ldy #S.PS.hStdOut lda (pPS),y - >PUSHA - >PUSHW ZPBufPtr - ply - pla - >PUSHYA len - >SYSCALL FWrite + jsr CS.Write bcs .9 .1 ldy #S.PS.hStdIn @@ -114,33 +107,33 @@ CS.RUN.LOOP >SLEEP ldy #S.PS.hStdIn lda (pPS),y - >PUSHA + jsr CS.Read + bcs .9 + + >STYA ZPDataLen + + lda (ZPBufPtr) + eor #$14 Ctrl-T + clc + beq .9 exit with A=0,CC + + lda hDev + jsr CS.Write + bcc CS.RUN.LOOP + +.9 rts +*-------------------------------------- +CS.Read >PUSHA >PUSHW ZPBufPtr >PUSHWI BUFSIZE >SYSCALL FRead - bcs .9 - - tax - lda (ZPBufPtr) - eor #$14 Ctrl-T - beq .8 - - txa - - pha - phy - >PUSHB hDev + rts +*-------------------------------------- +CS.Write >PUSHA >PUSHW ZPBufPtr - ply - pla - >PUSHYA len + >PUSHW ZPDataLen >SYSCALL FWrite - bcs .9 - - jmp CS.RUN.LOOP - -.8 sec -.9 rts + rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? @@ -172,8 +165,7 @@ MSG.DEVOK .AZ "Connected (Exit key is Ctrl-T)" .DUMMY .OR 0 DS.START -DS.END - .ED +DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/term.s diff --git a/BIN/WC.S.txt b/BIN/WC.S.txt index 45113ef7..98f7a10b 100644 --- a/BIN/WC.S.txt +++ b/BIN/WC.S.txt @@ -96,9 +96,11 @@ CS.RUN inc ArgIndex .4 >LDA.G hSrcBasePath bne .9 + >LDYA ZPPtr1 jsr InitSrcDirYA bcc CS.RUN + .99 rts *-------------------------------------- .5 lda bChar @@ -129,6 +131,7 @@ CS.RUN inc ArgIndex .6 >LDYAI 256 >SYSCALL GetMem bcs .99 + >STYA ZPFullPath stx hSrcFullPath @@ -153,6 +156,7 @@ CS.RUN inc ArgIndex >LDYAI 256 >SYSCALL GetMem bcs .99 + >STYA ZPLineBuf stx hMem *-------------------------------------- @@ -160,12 +164,16 @@ CS.RUN.LOOP ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs .99 + tay bne .10 + >SYSCALL GetChar bcs .99 + cmp #$03 Ctrl-C beq .99 Abort.... + cmp #$13 Ctrl-S bne .10 @@ -173,16 +181,20 @@ CS.RUN.LOOP ldy #S.PS.hStdIn eor #$ff sta bPause bne CS.RUN.LOOP + .10 lda bPause bne CS.RUN.LOOP Pause... jsr GetEntry bcs .9 + ldy #S.STAT.P.DRIVE lda (ZPFileStat),y ProDOS Device ? beq .5 + jsr CS.RUN.DEV bcc CS.RUN.LOOP + rts .5 ldy #S.STAT.MODE+1 @@ -193,9 +205,12 @@ CS.RUN.LOOP ldy #S.PS.hStdIn jsr CS.RUN.DIR bcs .99 + bra .8 + .6 jsr CS.RUN.FILE bcs .99 + bra .8 .9 jsr LeaveSubDir @@ -213,6 +228,7 @@ CS.RUN.LOOP ldy #S.PS.hStdIn CS.RUN.PIPE >LDYAI 256 >SYSCALL GetMem bcs .99 + >STYA ZPLineBuf stx hMem @@ -268,6 +284,7 @@ CS.RUN.FILE jsr FilterMatch jsr CS.RUN.AddFstat2Tstat lda bTotal bmi .8 + beq .61 lda #$fe @@ -283,6 +300,7 @@ CS.RUN.FILE jsr FilterMatch pla sec .9 jmp CS.RUN.CheckErr + .99 rts *-------------------------------------- CS.RUN.FILE.LOOP @@ -308,6 +326,7 @@ CS.RUN.FILE.LOOP .21 cmp #C.SPACE beq .3 + cmp #C.TAB bne .4 @@ -325,6 +344,7 @@ CS.RUN.FILE.LOOP .8 cmp #MLI.E.EOF bne .9 + clc rts @@ -332,6 +352,7 @@ CS.RUN.FILE.LOOP rts *-------------------------------------- CS.RUN.CheckErr bcc .9 + pha >PUSHW L.MSG.ERR >PUSHA @@ -341,6 +362,7 @@ CS.RUN.CheckErr bcc .9 eor #$80 asl pla + .9 rts *-------------------------------------- CS.RUN.GetFilePath @@ -413,17 +435,17 @@ CS.RUN.IncF lda (pData),y CS.RUN.AddFstat2Tstat >PUSHL.G fWordCount >PUSHL.G tWordCount - >FPU ADD32 + >FPU uADD >PULLL.G tWordCount >PUSHL.G fLineCount >PUSHL.G tLineCount - >FPU ADD32 + >FPU uADD >PULLL.G tLineCount >PUSHL.G fCharCount >PUSHL.G tCharCount - >FPU ADD32 + >FPU uADD >PULLL.G tCharCount rts *-------------------------------------- @@ -558,6 +580,7 @@ CS.RUN.CheckOpt ldy #1 .2 cmp OptionList,x beq .3 + dex bpl .2 diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index 7c44322a..9ad7d398 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -128,7 +128,7 @@ NEW .EM *-------------------------------------- * FPU Entry Point -*-------------------------------------- +*-------------------------------------- uint16 FPU.wMUL .EQ 0 FPU.wDIV .EQ 2 FPU.wMOD .EQ 4 @@ -152,7 +152,7 @@ FPU.wxOR .EQ 30 FPU.wLAND .EQ 32 FPU.wLOR .EQ 34 -*-------------------------------------- +*-------------------------------------- int16 FPU.iMUL .EQ 36 FPU.iDIV .EQ 38 FPU.iMOD .EQ 40 @@ -176,7 +176,7 @@ FPU.iXOR .EQ 66 FPU.iLAND .EQ 68 FPU.iLOR .EQ 70 -*-------------------------------------- +*-------------------------------------- uint32 FPU.uMUL .EQ 72 FPU.uDIV .EQ 74 FPU.uMOD .EQ 76 @@ -200,7 +200,7 @@ FPU.uXOR .EQ 102 FPU.uLAND .EQ 104 FPU.uLOR .EQ 106 -*-------------------------------------- +*-------------------------------------- int32 FPU.lMUL .EQ 108 FPU.lDIV .EQ 110 FPU.lMOD .EQ 112 @@ -224,7 +224,7 @@ FPU.lXOR .EQ 138 FPU.lLAND .EQ 140 FPU.lLOR .EQ 142 -*-------------------------------------- +*-------------------------------------- float FPU.fMUL .EQ 144 FPU.fDIV .EQ 146 FPU.fMOD .EQ 148 diff --git a/LIB/LIBCIFS.S.IO.txt b/LIB/LIBCIFS.S.IO.txt new file mode 100644 index 00000000..afafb627 --- /dev/null +++ b/LIB/LIBCIFS.S.IO.txt @@ -0,0 +1,571 @@ +NEW + AUTO 3,1 +*-------------------------------------- +CIFS.ChTyp +CIFS2.ChTyp +*-------------------------------------- +CIFS.ChMod +CIFS2.ChMod +*-------------------------------------- +CIFS.FStat +*-------------------------------------- +CIFS2.FStat lda #MLI.E.BADCALL + sec + rts +*-------------------------------------- +CIFS.Stat >STYA pPath resolved path + + jsr ClearSocket + jsr MakeTrans2Reg + + ldx #0 + +.1 lda SMB.QueryPathInfo,x + sta (ZPReqPtr),y + iny + inx + cpx #SMB.QueryPathInfo.Len + bne .1 + + jsr AppendPath + + lda #0 + sta (ZPReqPtr),y + iny + + jsr SetT2ReqLenYA + + pha + >PUSHB MountTable+3 hSocket + >PUSHW ZPReqPtr + + pla + >PUSHYA + + ldx #LIBTCPIP.Send + jsr GO.LIBTCPIP + bcs .9 + + jmp Sleep + +.9 >RET 4 +*-------------------------------------- +CIFS2.Stat jsr ReadSocket + bcs .9 + + jsr GetRespData + + ldy #S.NETBIOS+S.SMB.H.STATUS + lda (ZPRespPtr),y + beq .1 + + lda #MLI.E.FNOTFND + bra .99 + +.1 >PULLW ZPPtr2 Stat Buffer + + inc pStack Skip Filename + inc pStack + + jsr GetRespDataOffset + jsr FileInfo2StatBuf + jsr StatBuf2Ptr2 + + lda hResp + >SYSCALL2 FreeMem + + stz CIFS.Status + clc + rts + +.9 cmp #E.NODATA + bne .9 + + dec CIFS.Retries + beq .90 + + lda #0 + sec + rts + +.90 lda #MLI.E.IO + +.99 sec + stz CIFS.Status + >RET 4 +*-------------------------------------- +CIFS.MKDir >STYA pPath resolved path + + jsr MakeTrans2Reg + + ldx #0 + +.1 lda SMB.CreateDirectory,x + sta (ZPReqPtr),y + iny + inx + cpx #SMB.CreateDirectory.Len + bne .1 + + jsr AppendPath + + lda #0 + sta (ZPReqPtr),y + iny + + jsr SetT2ReqLenYA + + pha + >PUSHB MountTable+3 hSocket + >PUSHW ZPReqPtr + pla + >PUSHYA + + ldx #LIBTCPIP.Send + jsr GO.LIBTCPIP + bcs .9 + + jmp Sleep + +.9 >RET 4 +*-------------------------------------- +CIFS2.MKDir jsr ReadSocket + bcs .9 + + jsr GetRespData + + ldy #S.NETBIOS+S.SMB.H.STATUS + lda (ZPRespPtr),y + clc + beq .8 + + lda #MLI.E.DUPFILE + sec + +.8 jsr FreeRespData + + stz CIFS.Status + >RET 4 + +.9 cmp #E.NODATA + bne .99 + + dec CIFS.Retries + beq .98 + + lda #0 + sec + rts + +.98 lda #MLI.E.IO + +.99 sec + stz CIFS.Status + >RET 4 +*-------------------------------------- +CIFS.OpenDir >STYA pPath resolved path + + >LDYAI S.FD.DIR + >SYSCALL2 GetMem + bcs .9 + + >STYA ZPPtr2 + + lda #S.FD.T.DIR + sta (ZPPtr2) + + lda hHandler + ldy #S.FD.PFT + sta (ZPPtr2),y + + lda #0 + ldy #S.FD.DIR.EPB + sta (ZPPtr2),y EOF Flag + iny + sta (ZPPtr2),y + iny + sta (ZPPtr2),y + + >PUSHW pPath + >PUSHWI 0 + txa + >PUSHA + >SYSCALL2 mknod + +.9 rts +*-------------------------------------- +CIFS2.OpenDir lda #MLI.E.BADCALL + sec + rts +*-------------------------------------- +CIFS.ReadDir jsr GetPFD + + jsr ClearSocket + + ldy #S.FD.DIR.EPB + lda (pFD),y + beq .1 + + lda #MLI.E.EOF + sec + rts + +.1 iny + lda (pFD),y + iny + ora (pFD),y + bne CIFS.ReadDir.Next + + jsr MakeTrans2Reg + + ldx #0 + +.2 lda SMB.FindFirst2,x + sta (ZPReqPtr),y + iny + inx + cpx #SMB.FindFirst2.Len + bne .2 + + bra CIFS.ReadDir.Send + +CIFS.ReadDir.Next + jsr MakeTrans2Reg + + ldx #0 + +.2 lda SMB.FindNext2,x + sta (ZPReqPtr),y + iny + inx + cpx #SMB.FindNext2.Len + bne .2 + + phy + + ldy #S.FD.DIR.FC+1 + lda (pFD),y + tax + dey + lda (pFD),y + + ldy #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+7 Search ID + sta (ZPReqPtr),y + txa + iny + sta (ZPReqPtr),y + + ply +CIFS.ReadDir.Send + lda (pPath) + beq .1 + + jsr AppendPath + + lda #'\' + sta (ZPReqPtr),y + iny + +.1 lda #'*' + sta (ZPReqPtr),y + iny + lda #0 + sta (ZPReqPtr),y + iny + + jsr SetT2ReqLenYA + + pha + + >PUSHB MountTable+3 hSocket + >PUSHW ZPReqPtr + pla + >PUSHYA + + ldx #LIBTCPIP.Send + jsr GO.LIBTCPIP + bcs .9 + + jmp Sleep + +.9 rts +*-------------------------------------- +CIFS2.ReadDir jsr GetPFD + + jsr ReadSocket + bcs .90 + + jsr GetRespData + + ldy #S.NETBIOS+S.SMB.H.STATUS + lda (ZPRespPtr),y + beq .1 + +.91 sec + lda #MLI.E.IO + bra .9 + +.1 ldy #S.FD.DIR.FC + lda (pFD),y + iny + ora (pFD),y + sta bFlag + bne .2 + + ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H+1 Search ID + lda (ZPRespPtr),y + tax + dey + ora (ZPRespPtr),y + beq .91 + + lda (ZPRespPtr),y + + ldy #S.FD.DIR.FC + sta (pFD),y + iny + txa + sta (pFD),y + +.2 jsr GetRespDataOffset + jsr CIFS2.ReadDir.GetBuf + bcs .9 + + jsr GetRespDataOffset + jsr CIFS2.ReadDir.FillBuf + + lda hResp + >SYSCALL2 FreeMem + + >LDYA BufPtr + ldx hBuf + + stz CIFS.Status + clc + rts + +.9 stz CIFS.Status + + jmp FreeRespData + +.90 cmp #E.NODATA + bne .99 + + dec CIFS.Retries + beq .98 + + lda #0 + sec + rts + +.98 lda #MLI.E.IO + +.99 stz CIFS.Status + sec + rts +*-------------------------------------- +CIFS2.ReadDir.GetBuf + ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H Search Count + lda bFlag + bne .10 + + iny + iny + +.10 iny + iny + lda (ZPRespPtr),y End Of Search + phy + ldy #S.FD.DIR.EPB + sta (pFD),y + ply + + dey + dey + + lda (ZPRespPtr),y Search Count + beq .99 + tax + + lda #1 +Ending 0 + sta ZPPtr2 + stz ZPPtr2+1 + +.1 lda ZPPtr2 + clc + adc #S.STAT + sta ZPPtr2 + bcc .2 + + inc ZPPtr2+1 + +.2 lda ZPPtr1 + clc + adc #22 + sta ZPPtr1 + bcc .3 + + inc ZPPtr1+1 + +.3 lda (ZPPtr1) Filename Len + pha + sec + adc ZPPtr2 + sta ZPPtr2 + bcc .4 + + inc ZPPtr2+1 + +.4 pla + inc + sec + adc ZPPtr1 + sta ZPPtr1 + bcc .5 + + inc ZPPtr1+1 + +.5 dex + bne .1 + + >LDYA ZPPtr2 + >SYSCALL2 GetMem + bcs .9 + + >STYA BufPtr + >STYA ZPPtr2 + stx hBuf + +.9 rts + +.99 lda #MLI.E.EOF + sec + rts +*-------------------------------------- +CIFS2.ReadDir.FillBuf + ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H Search Count + lda bFlag + bne .10 + + iny + iny + +.10 lda (ZPRespPtr),y + tax + +.1 jsr FileInfo2StatBuf + + lda ZPPtr1 + sec skip Filename Len + adc #22 + sta ZPPtr1 + bcc .2 + + inc ZPPtr1+1 + +.2 ldy #$ff + +.3 iny + lda (ZPPtr1),y + sta (ZPPtr2),y + bne .3 + + tya + sec + adc ZPPtr1 + sta ZPPtr1 + bcc .4 + + inc ZPPtr1+1 + +.4 tya + sec + adc ZPPtr2 + sta ZPPtr2 + bcc .5 + + inc ZPPtr2+1 + +.5 jsr StatBuf2Ptr2 + + lda #S.STAT + clc + adc ZPPtr2 + sta ZPPtr2 + bcc .7 + + inc ZPPtr2+1 + +.7 dex + bne .1 + + lda #0 + sta (ZPPtr2) + + rts +*-------------------------------------- +CIFS.CloseDir tax + + lda Nod.Table.hName-2,x + beq .1 + + phx + + stz Nod.Table.hName-2,x + >SYSCALL2 FreeMem + + plx + +.1 lda Nod.Table.hFD-2,x + stz Nod.Table.hFD-2,x + >SYSCALL2 FreeMem + + stz CIFS.Status + clc + rts +*-------------------------------------- +CIFS2.CloseDir lda #MLI.E.INVPATH + sec + rts +*-------------------------------------- +CIFS.ChOwn +CIFS2.ChOwn + lda #MLI.E.BADCALL + sec + rts +*-------------------------------------- +CIFS.FOpen + + +CIFS2.FOpen + + lda #MLI.E.BADCALL + sec + rts +*-------------------------------------- +CIFS.FClose +CIFS2.FClose +CIFS.FRead +CIFS2.FRead +CIFS.FWrite +CIFS2.FWrite +CIFS.FFlush +CIFS2.FFlush +CIFS.FSeek +CIFS2.FSeek +CIFS.FTell +CIFS2.FTell +CIFS.FEOF +CIFS2.FEOF +CIFS.Remove +CIFS2.Remove +CIFS.Rename +CIFS2.Rename + lda #MLI.E.BADCALL + sec + rts +*-------------------------------------- +MAN +SAVE usr/src/lib/libcifs.io.s +LOAD usr/src/lib/libcifs.s +ASM diff --git a/LIB/LIBCIFS.S.txt b/LIB/LIBCIFS.S.txt index fd79653f..b46ce19e 100644 --- a/LIB/LIBCIFS.S.txt +++ b/LIB/LIBCIFS.S.txt @@ -62,33 +62,79 @@ J.CIFS .DA CIFS.ChTyp .DA CIFS.FStat .DA CIFS.Stat .DA CIFS.MKDir - .DA CIFS.MKNod - .DA CIFS.MKFIFO - .DA CIFS.Pipe + .DA CIFS.BADCALL MKNod + .DA CIFS.BADCALL MKFIFO + .DA CIFS.BADCALL Pipe + .DA CIFS.OpenDir .DA CIFS.ReadDir .DA CIFS.CloseDir - .DA CIFS.Open - .DA CIFS.Close - .DA CIFS.Read - .DA CIFS.Write + + .DA CIFS.BADCALL Open + .DA CIFS.BADCALL Close + .DA CIFS.BADCALL Read + .DA CIFS.BADCALL Write .DA CIFS.ChOwn + + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + + .DA CIFS.FOpen + .DA CIFS.FClose + .DA CIFS.FRead + .DA CIFS.FWrite + .DA CIFS.FFlush + .DA CIFS.FSeek + .DA CIFS.FTell + .DA CIFS.FEOF + .DA CIFS.Remove + .DA CIFS.Rename +*-------------------------------------- J.CIFS2 .DA CIFS2.ChTyp .DA CIFS2.ChMod .DA CIFS2.FStat .DA CIFS2.Stat .DA CIFS2.MKDir - .DA CIFS2.MKNod - .DA CIFS2.MKFIFO - .DA CIFS2.Pipe + .DA CIFS.BADCALL MKNod + .DA CIFS.BADCALL MKFIFO + .DA CIFS.BADCALL Pipe + .DA CIFS2.OpenDir .DA CIFS2.ReadDir .DA CIFS2.CloseDir - .DA CIFS2.Open - .DA CIFS2.Close - .DA CIFS2.Read - .DA CIFS2.Write + + .DA CIFS.BADCALL Open + .DA CIFS.BADCALL Close + .DA CIFS.BADCALL Read + .DA CIFS.BADCALL Write .DA CIFS2.ChOwn + + .DA CIFS.BADCALL FPutC... + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL + .DA CIFS.BADCALL ...UngetC + + .DA CIFS2.FOpen + .DA CIFS2.FClose + .DA CIFS2.FRead + .DA CIFS2.FWrite + .DA CIFS2.FFlush + .DA CIFS2.FSeek + .DA CIFS2.FTell + .DA CIFS2.FEOF + .DA CIFS2.Remove + .DA CIFS2.Rename +*-------------------------------------- L.LIBTCPIP .DA LIBTCPIP L.NETBIOS .DA NETBIOS .DA 0 @@ -134,10 +180,11 @@ CIFS.Negotiate lda (pStack) dec sta (pStack) - >PUSHWI SMB.NegReq.end-NETBIOS - >PUSHW L.NETBIOS - ldy #1+4 hSocket + ldy #1 hSocket lda (pStack),y + >PUSHA + >PUSHW L.NETBIOS + >PUSHWI SMB.NegReq.end-NETBIOS ldx #LIBTCPIP.Send jsr GO.LIBTCPIP @@ -266,10 +313,17 @@ CIFS.SessionSetup jsr SetReqLenYAtA - >PUSHYA - >PUSHW ZPReqPtr - ldy #6+4 hSocket + phy + pha + + ldy #6 hSocket lda (pStack),y + >PUSHA + >PUSHW ZPReqPtr + + pla + ply + >PUSHYA ldx #LIBTCPIP.Send jsr GO.LIBTCPIP @@ -391,10 +445,17 @@ CIFS.TreeConnect jsr SetReqLenYAtA - >PUSHYA - >PUSHW ZPReqPtr - ldy #4+4 hSocket + phy + pha + + ldy #4 hSocket lda (pStack),y + >PUSHA + >PUSHW ZPReqPtr + + pla + ply + >PUSHYA ldx #LIBTCPIP.Send jsr GO.LIBTCPIP @@ -504,556 +565,7 @@ CIFS.CallBack bit CIFS.Status ply jmp (J.CIFS2,x) *-------------------------------------- -CIFS.ChTyp -CIFS2.ChTyp -*-------------------------------------- -CIFS.ChMod -CIFS2.ChMod -*-------------------------------------- -CIFS.FStat -*-------------------------------------- -CIFS2.FStat lda #MLI.E.BADCALL - sec - rts -*-------------------------------------- -CIFS.Stat >STYA pPath resolved path - - jsr ClearSocket - jsr MakeTrans2Reg - - ldx #0 - -.1 lda SMB.QueryPathInfo,x - sta (ZPReqPtr),y - iny - inx - cpx #SMB.QueryPathInfo.Len - bne .1 - - jsr AppendPath - - lda #0 - sta (ZPReqPtr),y - iny - - jsr SetT2ReqLenYA - - >PUSHYA - >PUSHW ZPReqPtr - lda MountTable+3 hSocket - - ldx #LIBTCPIP.Send - jsr GO.LIBTCPIP - bcs .9 - - jmp Sleep - -.9 >RET 4 -*-------------------------------------- -CIFS2.Stat jsr ReadSocket - bcs .9 - - jsr GetRespData - - ldy #S.NETBIOS+S.SMB.H.STATUS - lda (ZPRespPtr),y - beq .1 - - lda #MLI.E.FNOTFND - bra .99 - -.1 >PULLW ZPPtr2 Stat Buffer - - inc pStack Skip Filename - inc pStack - - jsr GetRespDataOffset - jsr FileInfo2StatBuf - jsr StatBuf2Ptr2 - - lda hResp - >SYSCALL2 FreeMem - - stz CIFS.Status - clc - rts - -.9 cmp #E.NODATA - bne .9 - - dec CIFS.Retries - beq .90 - - lda #0 - sec - rts - -.90 lda #MLI.E.IO - -.99 sec - stz CIFS.Status - >RET 4 -*-------------------------------------- -CIFS.MKDir >STYA pPath resolved path - - jsr MakeTrans2Reg - - ldx #0 - -.1 lda SMB.CreateDirectory,x - sta (ZPReqPtr),y - iny - inx - cpx #SMB.CreateDirectory.Len - bne .1 - - jsr AppendPath - - lda #0 - sta (ZPReqPtr),y - iny - - jsr SetT2ReqLenYA - - >PUSHYA - >PUSHW ZPReqPtr - lda MountTable+3 hSocket - - ldx #LIBTCPIP.Send - jsr GO.LIBTCPIP - bcs .9 - - jmp Sleep - -.9 >RET 4 -*-------------------------------------- -CIFS2.MKDir jsr ReadSocket - bcs .9 - - jsr GetRespData - - ldy #S.NETBIOS+S.SMB.H.STATUS - lda (ZPRespPtr),y - clc - beq .8 - - lda #MLI.E.DUPFILE - sec - -.8 jsr FreeRespData - - stz CIFS.Status - >RET 4 - -.9 cmp #E.NODATA - bne .99 - - dec CIFS.Retries - beq .98 - - lda #0 - sec - rts - -.98 lda #MLI.E.IO - -.99 sec - stz CIFS.Status - >RET 4 -*-------------------------------------- -CIFS.MKNod -CIFS2.MKNod -*-------------------------------------- -CIFS.MKFIFO -CIFS2.MKFIFO -*-------------------------------------- -CIFS.Pipe -CIFS2.Pipe lda #MLI.E.BADCALL - sec - rts -*-------------------------------------- -CIFS.OpenDir >STYA pPath resolved path - - >LDYAI S.FD.DIR - >SYSCALL2 GetMem - bcs .9 - - >STYA ZPPtr2 - - lda #S.FD.T.DIR - sta (ZPPtr2) - - lda hHandler - ldy #S.FD.HANDLER - sta (ZPPtr2),y - - lda #0 - ldy #S.FD.DIR.EPB - sta (ZPPtr2),y EOF Flag - iny - sta (ZPPtr2),y - iny - sta (ZPPtr2),y - - >PUSHW pPath - >PUSHWI 0 - txa - >PUSHA - >SYSCALL2 mknod - -.9 rts -*-------------------------------------- -CIFS2.OpenDir lda #MLI.E.BADCALL - sec - rts -*-------------------------------------- -CIFS.ReadDir jsr GetPFD - - jsr ClearSocket - - ldy #S.FD.DIR.EPB - lda (pFD),y - beq .1 - - lda #MLI.E.EOF - sec - rts - -.1 iny - lda (pFD),y - iny - ora (pFD),y - bne CIFS.ReadDir.Next - - jsr MakeTrans2Reg - - ldx #0 - -.2 lda SMB.FindFirst2,x - sta (ZPReqPtr),y - iny - inx - cpx #SMB.FindFirst2.Len - bne .2 - - bra CIFS.ReadDir.Send - -CIFS.ReadDir.Next - jsr MakeTrans2Reg - - ldx #0 - -.2 lda SMB.FindNext2,x - sta (ZPReqPtr),y - iny - inx - cpx #SMB.FindNext2.Len - bne .2 - - phy - - ldy #S.FD.DIR.FC+1 - lda (pFD),y - tax - dey - lda (pFD),y - - ldy #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+7 Search ID - sta (ZPReqPtr),y - txa - iny - sta (ZPReqPtr),y - - ply -CIFS.ReadDir.Send - lda (pPath) - beq .1 - - jsr AppendPath - - lda #'\' - sta (ZPReqPtr),y - iny - -.1 lda #'*' - sta (ZPReqPtr),y - iny - lda #0 - sta (ZPReqPtr),y - iny - - jsr SetT2ReqLenYA - - >PUSHYA - >PUSHW ZPReqPtr - lda MountTable+3 hSocket - - ldx #LIBTCPIP.Send - jsr GO.LIBTCPIP - bcs .9 - - jmp Sleep - -.9 rts -*-------------------------------------- -CIFS2.ReadDir jsr GetPFD - - jsr ReadSocket - bcs .90 - - jsr GetRespData - - ldy #S.NETBIOS+S.SMB.H.STATUS - lda (ZPRespPtr),y - beq .1 - -.91 sec - lda #MLI.E.IO - bra .9 - -.1 ldy #S.FD.DIR.FC - lda (pFD),y - iny - ora (pFD),y - sta bFlag - bne .2 - - ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H+1 Search ID - lda (ZPRespPtr),y - tax - dey - ora (ZPRespPtr),y - beq .91 - - lda (ZPRespPtr),y - - ldy #S.FD.DIR.FC - sta (pFD),y - iny - txa - sta (pFD),y - -.2 jsr GetRespDataOffset - jsr CIFS2.ReadDir.GetBuf - bcs .9 - - jsr GetRespDataOffset - jsr CIFS2.ReadDir.FillBuf - - lda hResp - >SYSCALL2 FreeMem - - >LDYA BufPtr - ldx hBuf - - stz CIFS.Status - clc - rts - -.9 stz CIFS.Status - - jmp FreeRespData - -.90 cmp #E.NODATA - bne .99 - - dec CIFS.Retries - beq .98 - - lda #0 - sec - rts - -.98 lda #MLI.E.IO - -.99 stz CIFS.Status - sec - rts -*-------------------------------------- -CIFS2.ReadDir.GetBuf - ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H Search Count - lda bFlag - bne .10 - - iny - iny - -.10 iny - iny - lda (ZPRespPtr),y End Of Search - phy - ldy #S.FD.DIR.EPB - sta (pFD),y - ply - - dey - dey - - lda (ZPRespPtr),y Search Count - beq .99 - tax - - lda #1 +Ending 0 - sta ZPPtr2 - stz ZPPtr2+1 - -.1 lda ZPPtr2 - clc - adc #S.STAT - sta ZPPtr2 - bcc .2 - - inc ZPPtr2+1 - -.2 lda ZPPtr1 - clc - adc #22 - sta ZPPtr1 - bcc .3 - - inc ZPPtr1+1 - -.3 lda (ZPPtr1) Filename Len - pha - sec - adc ZPPtr2 - sta ZPPtr2 - bcc .4 - - inc ZPPtr2+1 - -.4 pla - inc - sec - adc ZPPtr1 - sta ZPPtr1 - bcc .5 - - inc ZPPtr1+1 - -.5 dex - bne .1 - - >LDYA ZPPtr2 - >SYSCALL2 GetMem - bcs .9 - - >STYA BufPtr - >STYA ZPPtr2 - stx hBuf - -.9 rts - -.99 lda #MLI.E.EOF - sec - rts -*-------------------------------------- -CIFS2.ReadDir.FillBuf - ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H Search Count - lda bFlag - bne .10 - - iny - iny - -.10 lda (ZPRespPtr),y - tax - -.1 jsr FileInfo2StatBuf - - lda ZPPtr1 - sec skip Filename Len - adc #22 - sta ZPPtr1 - bcc .2 - - inc ZPPtr1+1 - -.2 ldy #$ff - -.3 iny - lda (ZPPtr1),y - sta (ZPPtr2),y - bne .3 - - tya - sec - adc ZPPtr1 - sta ZPPtr1 - bcc .4 - - inc ZPPtr1+1 - -.4 tya - sec - adc ZPPtr2 - sta ZPPtr2 - bcc .5 - - inc ZPPtr2+1 - -.5 jsr StatBuf2Ptr2 - - lda #S.STAT - clc - adc ZPPtr2 - sta ZPPtr2 - bcc .7 - - inc ZPPtr2+1 - -.7 dex - bne .1 - - lda #0 - sta (ZPPtr2) - - rts -*-------------------------------------- -CIFS.CloseDir tax - - lda Nod.Table.hName-2,x - beq .1 - - phx - - stz Nod.Table.hName-2,x - >SYSCALL2 FreeMem - - plx - -.1 lda Nod.Table.hFD-2,x - stz Nod.Table.hFD-2,x - >SYSCALL2 FreeMem - - stz CIFS.Status - clc - rts -*-------------------------------------- -CIFS2.CloseDir lda #MLI.E.INVPATH - sec - rts -*-------------------------------------- -CIFS.Open -CIFS2.Open -*-------------------------------------- -CIFS.Close -CIFS2.Close - lda #MLI.E.INVPATH - sec - rts -*-------------------------------------- -CIFS.Read -CIFS2.Read -*-------------------------------------- -CIFS.Write -CIFS2.Write -*-------------------------------------- -CIFS.ChOwn -CIFS2.ChOwn - lda #MLI.E.BADCALL - sec - rts + .INB usr/src/lib/libcifs.io.s *-------------------------------------- GetPFD tax phx @@ -1205,7 +717,7 @@ Sleep ldy #S.PS.PID dec CIFS.Status stz CIFS.Retries - + lda #0 sec rts @@ -1370,17 +882,21 @@ StatBuf2Ptr2 ldy #S.STAT-1 *-------------------------------------- ClearSocket jsr ReadSocket bcs .8 - + >SYSCALL2 FreeMem bra ClearSocket - -.8 clc + +.8 clc rts *-------------------------------------- ReadSocket lda MountTable+3 hSocket ldx #LIBTCPIP.Recv GO.LIBTCPIP jmp (pLIBTCPIP) *-------------------------------------- +CIFS.BADCALL lda #MLI.E.BADCALL + sec + rts +*-------------------------------------- CS.END *-------------------------------------- NETBIOS .DA #0 DIRECT TCP TRANSPORT @@ -1470,7 +986,7 @@ SMB.ComRead.H .DA #10 WORD COUNT .HS 00000000 Timeout .HS 0000 Remaining .HS 0000 ByteCount -SMB.ComRead.H.Len .EQ *-SMB.ComRead.H +SMB.ComRead.H.Len .EQ *-SMB.ComRead.H *-------------------------------------- #$2F SMB.ComWrite.H .DA #12 WORD COUNT .HS FF000000 NO MORE CMD @@ -1481,18 +997,18 @@ SMB.ComWrite.H .DA #12 WORD COUNT .BS 2 Remaining .HS 0000 Reserved .BS 2 DataLength - .BS 2 DataOffset + .BS 2 DataOffset SMB.ComWrite.H.Len .EQ *-SMB.ComWrite.H .BS 2 ByteCount SMB.ComWrite.T * DATA..... -SMB.ComWrite.T.Len .EQ *-SMB.ComWrite.T +SMB.ComWrite.T.Len .EQ *-SMB.ComWrite.T *-------------------------------------- #$04 SMB.ComClose.H .DA #3 WORD COUNT .BS 2 FID .HS 00000000 LastTimeModified .HS 0000 ByteCount -SMB.ComClose.H.Len .EQ *-SMB.ComClose.H +SMB.ComClose.H.Len .EQ *-SMB.ComClose.H *-------------------------------------- SMB.Trans2.H .DA #15 WORD COUNT .BS 2 TotalParamCount @@ -1518,11 +1034,11 @@ SMB.Open2 .DA 0 TRANS2_OPEN2 .HS 0000 Flags .BS 2 Access Mode .HS 0000 Reserved1 - .BS 2 FileAttributes - .HS 00000000 CreationTime + .BS 2 FileAttributes + .HS 00000000 CreationTime .BS 2 OpenMode .HS 00000000 AllocationSize - .HS 00000000000000000000 Reserved + .HS 00000000000000000000 Reserved * .AZ "filename" SMB.Open2.Len .EQ *-SMB.Open2 *-------------------------------------- diff --git a/LIB/LIBETALK.S.AARP.txt b/LIB/LIBETALK.S.AARP.txt index 361667b6..efcb01bf 100644 --- a/LIB/LIBETALK.S.AARP.txt +++ b/LIB/LIBETALK.S.AARP.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF */-------------------------------------- * # AARP.Clear * Clear AARP Cache @@ -328,6 +327,6 @@ AARP.Send >STYA IOCTL+S.IOCTL.BUFPTR jmp FRM.Send.IOCTL *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S.AARP -LOAD USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s.aarp +LOAD usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBETALK.S.CFG.txt b/LIB/LIBETALK.S.CFG.txt index db4a3a03..94adcecd 100644 --- a/LIB/LIBETALK.S.CFG.txt +++ b/LIB/LIBETALK.S.CFG.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- CFG.SET >PULLW ZPTmpPtr1 ETKCFG @@ -29,6 +28,6 @@ CFG.GET >LDYA L.ETKCFG rts *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S.CFG -LOAD USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s.cfg +LOAD usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBETALK.S.DDP.txt b/LIB/LIBETALK.S.DDP.txt index f9ae7252..093b66cb 100644 --- a/LIB/LIBETALK.S.DDP.txt +++ b/LIB/LIBETALK.S.DDP.txt @@ -1,11 +1,10 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- DDP.IN clc rts *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S.DDP -LOAD USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s.ddp +LOAD usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBETALK.S.ELAP.txt b/LIB/LIBETALK.S.ELAP.txt index c86d334e..d9b60fd7 100644 --- a/LIB/LIBETALK.S.ELAP.txt +++ b/LIB/LIBETALK.S.ELAP.txt @@ -1,10 +1,9 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S.ELAP -LOAD USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s.elap +LOAD usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBETALK.S.FRM.txt b/LIB/LIBETALK.S.FRM.txt index e046adae..4ac07692 100644 --- a/LIB/LIBETALK.S.FRM.txt +++ b/LIB/LIBETALK.S.FRM.txt @@ -1,7 +1,7 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- + *-------------------------------------- FRM.Send ldx #3 @@ -17,6 +17,6 @@ FRM.Send.IOCTL >PUSHB ETKCFG+S.NETCFG.DevID rts *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S.FRM -LOAD USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s.frm +LOAD usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBETALK.S.RTMP.txt b/LIB/LIBETALK.S.RTMP.txt index 54515d01..b02746b4 100644 --- a/LIB/LIBETALK.S.RTMP.txt +++ b/LIB/LIBETALK.S.RTMP.txt @@ -1,10 +1,9 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S.RTMP -LOAD USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s.rtmp +LOAD usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBETALK.S.txt b/LIB/LIBETALK.S.txt index 539aaef6..99c35eb4 100644 --- a/LIB/LIBETALK.S.txt +++ b/LIB/LIBETALK.S.txt @@ -5,12 +5,12 @@ NEW .OR $2000 .TF lib/libetalk *-------------------------------------- - .INB INC/MACROS.I - .INB INC/A2OSX.I - .INB INC/NIC.I - .INB INC/ETH.I - .INB INC/LIB.NET.I - .INB INC/LIBETALK.I + .INB inc/macros.i + .INB inc/a2osx.i + .INB inc/nic.i + .INB inc/eth.i + .INB inc/lib.net.i + .INB inc/libetalk.i *-------------------------------------- ZPFrameInPtr .EQ ZPLIB ZPFrameInLen .EQ ZPLIB+2 @@ -117,12 +117,12 @@ PULSE and #S.EVT.F.T1SEC .9 rts *-------------------------------------- - .INB USR/SRC/LIB/LIBETALK.S.AARP - .INB USR/SRC/LIB/LIBETALK.S.CFG - .INB USR/SRC/LIB/LIBETALK.S.DDP - .INB USR/SRC/LIB/LIBETALK.S.ELAP - .INB USR/SRC/LIB/LIBETALK.S.FRM - .INB USR/SRC/LIB/LIBETALK.S.RTMP + .INB usr/src/lib/libetalk.s.aarp + .INB usr/src/lib/libetalk.s.cfg + .INB usr/src/lib/libetalk.s.ddp + .INB usr/src/lib/libetalk.s.elap + .INB usr/src/lib/libetalk.s.frm + .INB usr/src/lib/libetalk.s.rtmp *-------------------------------------- CS.END *-------------------------------------- @@ -169,5 +169,5 @@ TmpDWord .BS 4 TmpOffset .BS 2 *-------------------------------------- MAN -SAVE USR/SRC/LIB/LIBETALK.S +SAVE usr/src/lib/libetalk.s ASM diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index dc9edd31..3e0a7cf3 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -1,11 +1,10 @@ NEW AUTO 3,1 - .LIST OFF */-------------------------------------- * # ARP.Clear * Clear ARP Cache -* **In:** -* ## RETURN VALUE +* **In:** +* ## RETURN VALUE *\-------------------------------------- ARP.Clear jsr ARP.GetCache @@ -27,7 +26,7 @@ ARP.Clear.I lda #0 * PUSHW PTR to IP * ## RETURN VALUE * CC: hit: MAC filled -* CS: missed +* CS: missed *\-------------------------------------- ARP.Query jsr ARP.GetIP @@ -55,7 +54,7 @@ ARP.Query jsr ARP.GetIP ARP.Add jsr ARP.GetIP >PULLW ZPPtrMAC MAC - + ldy #5 .2 lda (ZPPtrMAC),y @@ -199,8 +198,8 @@ ARP.QUERY.I jsr ARP.FIND.BY.IP jsr ARP.ADD.I .9 lda #ERR.ARP.PENDING - sec -.99 rts + sec +.99 rts *-------------------------------------- ARP.FIND.BY.IP jsr ARP.GetCache @@ -215,7 +214,7 @@ ARP.FIND.BY.IP jsr ARP.GetCache bne .3 iny - cpy #S.ARPCACHE.IP+4 + cpy #S.ARPCACHE.IP+4 bne .2 clc @@ -308,18 +307,18 @@ ARP.NextCache lda ZPCachePtr sta ZPCachePtr bcc .8 inc ZPCachePtr+1 - + .8 rts *-------------------------------------- ARP.GetIP >PULLW ZPPtrIP - + ldy #3 .1 lda (ZPPtrIP),y sta ARP.TmpCache+S.ARPCACHE.IP,y dey bpl .1 - + rts *-------------------------------------- ARP.AddFromFrameInPtr @@ -328,7 +327,7 @@ ARP.AddFromFrameInPtr ldy #S.ETH.SRCMAC+5 jsr ARP.GetMacFromFrameInPtrY - + lda #K.ARP.TTL sta ARP.TmpCache+S.ARPCACHE.TTL lda /K.ARP.TTL @@ -355,7 +354,7 @@ ARP.GetMacFromFrameInPtrY dey dex bpl .1 - + rts *-------------------------------------- ARP.Send >STYA IOCTL+S.IOCTL.BUFPTR diff --git a/LIB/LIBTCPIP.S.CFG.txt b/LIB/LIBTCPIP.S.CFG.txt index 24822f3a..205705a5 100644 --- a/LIB/LIBTCPIP.S.CFG.txt +++ b/LIB/LIBTCPIP.S.CFG.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- CFG.SET >PULLW ZPTmpPtr1 IPCFG @@ -43,7 +42,7 @@ CFG.SET >PULLW ZPTmpPtr1 IPCFG ldx #IOCTL.STATUS jsr CFG.SET.IOCTL bcs .9 - + ldx #11 IP/MASK/GW .4 lda IPCFG+S.IPCFG.IP,x @@ -61,8 +60,8 @@ CFG.SET >PULLW ZPTmpPtr1 IPCFG .5 stz SA.LOCAL+S.SOCKADDR.PORT stz SA.LOCAL+S.SOCKADDR.PORT+1 + >PUSHB hDNSSocket >PUSHW L.SA.LOCAL - lda hDNSSocket jmp SKT.Bind .9 rts diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 4cd6db6d..8877a1f8 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -1,11 +1,10 @@ NEW AUTO 3,1 - .LIST OFF */-------------------------------------- * # DNS.Clear * Clear DNS Cache -* **In:** -* ## RETURN VALUE +* **In:** +* ## RETURN VALUE *\-------------------------------------- DNS.Clear ldx #K.DNSCACHE.SIZE*S.DNSCACHE @@ -20,10 +19,10 @@ DNS.Clear ldx #K.DNSCACHE.SIZE*S.DNSCACHE * Query DNS for specified host * **In:** * PUSHW = PTR to IP to fill with cached data -* PUSHW = hostname PTR to PSTR +* PUSHW = hostname PTR to PSTR * ## RETURN VALUE * CC: hit: IP filled with address -* CS: missed +* CS: missed *\-------------------------------------- DNS.Query >PULLW ZPPtrDNS Get host string >PULLW ZPPtrIP Get IP address to fill @@ -126,10 +125,10 @@ DNS.REQUEST.SEND dey bpl .2 -.4 >PUSHW L.SA.REMOTE - >PUSHW DNS.MSG.LEN +.4 >PUSHB hDNSSocket >PUSHW L.DNS.MSG - lda hDNSSocket + >PUSHW DNS.MSG.LEN + >PUSHW L.SA.REMOTE jmp SKT.SendTo .8 clc @@ -165,7 +164,7 @@ DNS.CSTR2DNS lda (ZPPtrDNS) cmp #'Z'+1 bcs .2 - + adc #$20 .2 inx @@ -248,13 +247,13 @@ DNS.ADD.I sta DNS.TmpCache *\-------------------------------------- DNS.GetCAche >LDYA L.DNS.CACHE >STYA ZPCachePtr - + clc rts *-------------------------------------- DNS.FIND.BY.NAME jsr DNS.GetCAche - + ldx #K.DNSCACHE.SIZE .1 lda (ZPCachePtr) @@ -271,7 +270,7 @@ DNS.FIND.BY.NAME bcc .8 .6 jsr DNS.NextCache - + dex bne .1 @@ -280,7 +279,7 @@ DNS.FIND.BY.NAME *-------------------------------------- DNS.UPDATE.BY.ID jsr DNS.GetCAche - + ldx #K.DNSCACHE.SIZE .1 lda (ZPCachePtr) @@ -299,13 +298,13 @@ DNS.UPDATE.BY.ID lda #S.DNSCACHE.STATUS.RESOLVED sta (ZPCachePtr) ldy #S.DNSCACHE.TTL - + .2 lda DNS.TmpCache,y sta (ZPCachePtr),y iny cpy #S.DNSCACHE bne .2 - + clc rts @@ -390,7 +389,7 @@ DNS.EXPIRE jsr DNS.GetCAche iny dex bne .2 - + bcs .6 jsr DNS.FREE .6 plx @@ -461,7 +460,7 @@ DNS.POLL lda hDNSSocket tay bra .1 -.2 iny +.2 iny iny iny Skip QTYPE & QCLASS iny @@ -473,11 +472,11 @@ DNS.POLL lda hDNSSocket .3 lda (ZPFrameInPtr),y beq .32 - bpl .31 Pointer ? + bpl .31 Pointer ? iny yes, skip 2 bytes iny bra .32 - + .31 tya sec adc (ZPFrameInPtr),y Skip LEN+1 bytes @@ -523,7 +522,7 @@ DNS.POLL lda hDNSSocket bne .5 jsr DNS.UPDATE.BY.ID - + .9 jmp FRM.DiscardIn *-------------------------------------- DNS.NextCache lda ZPCachePtr @@ -532,7 +531,7 @@ DNS.NextCache lda ZPCachePtr sta ZPCachePtr bcc .8 inc ZPCachePtr+1 - + .8 rts *-------------------------------------- MAN diff --git a/LIB/LIBTCPIP.S.FRM.txt b/LIB/LIBTCPIP.S.FRM.txt index 727095b2..a825b78e 100644 --- a/LIB/LIBTCPIP.S.FRM.txt +++ b/LIB/LIBTCPIP.S.FRM.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- FRM.GetTargetSKT.TCPUDP ldy #S.TCPUDP.SRCPORT @@ -97,7 +96,7 @@ FRM.NewIP stx .8+1 ldy #S.ETH.EII.TYPE lda /S.ETH.EII.TYPE.IP - sta (ZPFrameOutPtr),y + sta (ZPFrameOutPtr),y iny lda #S.ETH.EII.TYPE.IP sta (ZPFrameOutPtr),y @@ -109,7 +108,7 @@ FRM.NewIP stx .8+1 * lda #$0 * sta (ZPFrameOutPtr),y -* ldy #S.IP.FRAGMENT.FLAGS +* ldy #S.IP.FRAGMENT.FLAGS * sta (ZPFrameOutPtr),y * iny * sta (ZPFrameOutPtr),y @@ -132,7 +131,7 @@ FRM.NewIP stx .8+1 ldy #S.IP.TTL lda #K.IP.TTL sta (ZPFrameOutPtr),y - + .7 ldy #S.IP.PROTOCOL .8 lda #$ff @@ -147,7 +146,7 @@ FRM.SendIP php ldy #S.IP.SRC+3 for proper UDP/TCP CRC calculation .1 lda IPCFG+S.IPCFG.IP,x - sta (ZPFrameOutPtr),y + sta (ZPFrameOutPtr),y dey dex bpl .1 @@ -236,7 +235,7 @@ FRM.SendIP php jsr IP.SetDestMAC bcs FRM.Queue - + .6 jsr FRM.Send bcs FRM.Queue @@ -256,7 +255,7 @@ FRM.Queue plp inx cpx #K.FRMQUEUE.SIZE bne .1 - + ldx #0 .1 cpx FRM.QUEUE.Tail @@ -309,9 +308,9 @@ FRM.Retry ldx FRM.QUEUE.Tail .3 ldx FRM.QUEUE.Tail sta FRM.QUEUE.State,x save error... - dec FRM.QUEUE.Retry,x + dec FRM.QUEUE.Retry,x bne .8 exit....until next run! - + .4 ldx FRM.QUEUE.Tail lda FRM.QUEUE.hMem,x Success,or max retry, discard entry inx @@ -331,7 +330,7 @@ FRM.Send ldx #3 sta IOCTL+S.IOCTL.BUFPTR,x dex bpl .1 - + FRM.Send.IOCTL >PUSHB IPCFG+S.NETCFG.DevID >PUSHBI IOCTL.WRITE >PUSHW L.IOCTL diff --git a/LIB/LIBTCPIP.S.HST.txt b/LIB/LIBTCPIP.S.HST.txt index 204a4934..dccf552d 100644 --- a/LIB/LIBTCPIP.S.HST.txt +++ b/LIB/LIBTCPIP.S.HST.txt @@ -1,13 +1,12 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- HST.GetByName >PULLW ZPPtrDNS >PULLW ZPPtrIP >PUSHW ZPPtrDNS >PUSHW L.HST.SScanF - + ldx #0 .1 txa diff --git a/LIB/LIBTCPIP.S.ICMP.txt b/LIB/LIBTCPIP.S.ICMP.txt index 1abcb929..a03e3b6b 100644 --- a/LIB/LIBTCPIP.S.ICMP.txt +++ b/LIB/LIBTCPIP.S.ICMP.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- ICMP.IN ldy #S.ICMP.TYPE lda (ZPFrameInPtr),y @@ -30,18 +29,18 @@ ICMP.IN.ECHOREQ ldy #S.IP.DST+3 * stz hFrameIn DO NOT DISCARD this frame,it is SOURCE frame!!! sta hFrameOut - ldx #3 + ldx #3 .2 lda ZPFrameInPtr,x sta ZPFrameOutPtr,x dex bpl .2 - ldx #3 + ldx #3 ldy #S.IP.DST+3 .3 lda ARP.TmpCache+S.ARPCACHE.IP,x - sta (ZPFrameOutPtr),y + sta (ZPFrameOutPtr),y dey dex bpl .3 diff --git a/LIB/LIBTCPIP.S.IP.txt b/LIB/LIBTCPIP.S.IP.txt index 17e2df6b..757cc2ac 100644 --- a/LIB/LIBTCPIP.S.IP.txt +++ b/LIB/LIBTCPIP.S.IP.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- IP.IN ldy #S.IP.PROTOCOL lda (ZPFrameInPtr),y @@ -202,7 +201,7 @@ IP.SetDestMAC ldy #S.IP.DST dex bpl .5 bra .8 - + .6 ldx #3 Not Same network, query ARP for GW .7 lda IPCFG+S.IPCFG.GW,x diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 3a54e52b..320572d0 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -7,15 +7,18 @@ NEW * `hFD socket(short int type, short int protocol);` * ## ASM * **In:** +* `>PUSHB type` * `>PUSHB protocol` -* `lda type` * `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` * ## RETURN VALUE * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- -SKT.Socket tax - >PULLA get protocol (RAW) +SKT.Socket >PULLA get protocol (RAW) + pha + >PULLA + tax + pla SKT.Socket.I jmp (J.SKT.Socket,x) SKT.Socket.RAW ldy #S.SOCKET @@ -98,7 +101,7 @@ SKT.Socket.FindFree .8 ldy #$FF SELF MODIFIED sta SKT.TABLE,y - + * clc rts */-------------------------------------- @@ -108,16 +111,15 @@ SKT.Socket.FindFree * `int bind(hFD fd, const struct sockaddr *addr);` * ## ASM * **In:** +* `>PUSHB fd` * `>PUSHW addr` -* `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` * ## RETURN VALUE * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- -SKT.bind >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT - jsr SKT.PullLocAddr +SKT.bind jsr SKT.PullLocAddr + jsr SKT.PullhFD lda SKT.LOC.ADDR+S.SOCKADDR.PORT ora SKT.LOC.ADDR+S.SOCKADDR.PORT+1 @@ -168,17 +170,15 @@ SKT.bind >SYSCALL2 GetMemPtr * `int connect(hFD fd, const struct sockaddr *addr);` * ## ASM * **In:** +* `>PUSHB fd` * `>PUSHW addr` -* `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.socket` * ## RETURN VALUE * CC: A = hSOCKET * CS: A = EC *\-------------------------------------- -SKT.connect >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT - - jsr SKT.PullRemAddr +SKT.connect jsr SKT.PullRemAddr + jsr SKT.PullhFD ldy #S.SOCKET.T lda (ZPPtrSKT),y @@ -238,8 +238,7 @@ SKT.connect.SEQPKT * ## RETURN VALUE * CS: A = EC *\-------------------------------------- -SKT.listen >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT +SKT.listen jsr SKT.GetFD ldy #S.SOCKET.T lda (ZPPtrSKT),y @@ -275,8 +274,7 @@ SKT.listen.RTS rts * ## RETURN VALUE * A = hSocket *\-------------------------------------- -SKT.Accept >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT +SKT.Accept jsr SKT.GetFD ldy #S.SOCKET.O lda (ZPPtrSKT),y @@ -321,8 +319,7 @@ SKT.GetFromQueue * ## RETURN VALUE *\-------------------------------------- SKT.shutdown pha - >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT + jsr SKT.GetFD ldy #S.SOCKET.O lda (ZPPtrSKT),y @@ -338,7 +335,7 @@ SKT.shutdown pha lda (ZPPtrSKT),y cmp #S.SOCKET.TCP.S.TIMEWT bcs .7 - + pla jsr SKT.GetTCB @@ -397,9 +394,9 @@ SKT.shutdown.RTS * `int skt.read(hFD fd, void *buf, int count);` * ## ASM * **In:** -* `>PUSHWI count` +* `>PUSHB fd` * `>PUSHW buf` -* `lda fd` +* `>PUSHW count` * `>LIBCALL hLIBTCPIP,LIBTCPIP.read` * ## RETURN VALUE * CC: Y,A = bytes read @@ -422,8 +419,8 @@ SKT.Read jsr SKT.PullhFDDataInPtrLen stx ZPDataInLen less data than INUSED, Get only INUSED data lda (ZPPtrSKT),y sta ZPDataInLen+1 - bra SKT.GetDataFromSktIn + .7 jsr SKT.CheckStream bcs .99 I/O error @@ -599,9 +596,9 @@ SKT.AddDataToSktIn * `int skt.write(hFD fd, const void *buf, int count);` * ## ASM * **In:** -* `>PUSHWI count` +* `>PUSHB fd` * `>PUSHW buf` -* `lda fd` +* `>PUSHW count` * `>LIBCALL hLIBTCPIP,LIBTCPIP.write` * ## RETURN VALUE * CC: Y,A = bytes written @@ -611,6 +608,7 @@ SKT.Write jsr SKT.PullhFDDataInPtrLen jsr SKT.CheckStream bcs .99 + jsr SKT.GetTCB ldx SKT.Cache+S.SOCKET.TCP.OUTFREE @@ -765,6 +763,7 @@ SKT.GetDataFromSktOut .1 inx bne .2 + pla inc beq .8 @@ -779,6 +778,7 @@ SKT.GetDataFromSktOut sta (ZPDataOutPtr) inc ZPDataOutPtr bne .3 + inc ZPDataOutPtr+1 .3 iny @@ -788,6 +788,7 @@ SKT.GetDataFromSktOut lda SKT.Cache+S.SOCKET.TCP.OUTTAILSENT+1 cmp /K.TCP.WSIZE bne .1 + stz SKT.Cache+S.SOCKET.TCP.OUTTAILSENT+1 lda ZPTmpPtr1+1 @@ -803,30 +804,37 @@ SKT.GetDataFromSktOut clc rts */-------------------------------------- -* # Recv (RAW,DGRAM,SEQPKT) * # RecvFrom (RAW,DGRAM,SEQPKT) * ## C -* `hMem recv(hFD fd);` * `hMem recvfrom(hFD fd, struct sockaddr *addr);` * ## ASM * **In:** +* `>PUSHB fd` * `>PUSHW addr` (RecvFrom) +* `>LIBCALL hLIBTCPIP,LIBTCPIP.Recv` +* ## RETURN VALUE +* CC: A = hMem +* CS: A = EC +*\-------------------------------------- +SKT.RecvFrom >PULLW ZPTmpPtr1 addr + >PULLA + sec + .HS 90 BCC +*/-------------------------------------- +* # Recv (RAW,DGRAM,SEQPKT) +* ## C +* `hMem recv(hFD fd);` +* ## ASM +* **In:** * `lda fd` * `>LIBCALL hLIBTCPIP,LIBTCPIP.Recv` * ## RETURN VALUE * CC: A = hMem * CS: A = EC *\-------------------------------------- -SKT.RecvFrom pha - >PULLW ZPTmpPtr1 addr - pla - sec - .HS 90 BCC - SKT.Recv clc php - >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT + jsr SKT.GetFD ldy #S.SOCKET.T lda (ZPPtrSKT),y @@ -837,7 +845,7 @@ SKT.Recv clc jsr SKT.GetFromQueue SEQPKT bcc .1 - + jsr SKT.CheckTCP bcs .91 @@ -845,10 +853,10 @@ SKT.Recv clc plp sec rts - + .10 jsr SKT.GetFromQueue bcs .90 - + .1 plp if CS, RecvFrom bcc .9 CC, Recv : Exit with CC and A=hFrame @@ -902,33 +910,38 @@ SKT.Recv clc sec rts */-------------------------------------- -* # Send (RAW,DGRAM,SEQPKT) * # SendTo (RAW,DGRAM,SEQPKT) * ## C -* `int skt.send(hFD fd, const void *buf, int count);` * `int skt.sendto(hFD fd, const void *buf, int count, const struct sockaddr *addr);` * ## ASM * **In:** -* `>PUSHW addr` (SendTo) -* `>PUSHWI count` +* `>PUSHB fd` * `>PUSHW buf` -* `lda fd` +* `>PUSHWI count` +* `>PUSHW addr` +* `>LIBCALL hLIBTCPIP,LIBTCPIP.sendto` +* ## RETURN VALUE +* CC: Y,A = bytes written +* CS: A = EC +*\-------------------------------------- +SKT.SendTo jsr SKT.PullRemAddr +*/-------------------------------------- +* # Send (RAW,DGRAM,SEQPKT) +* ## C +* `int skt.send(hFD fd, const void *buf, int count);` +* ## ASM +* **In:** +* `>PUSHB fd` +* `>PUSHW buf` +* `>PUSHWI count` * `>LIBCALL hLIBTCPIP,LIBTCPIP.send` * ## RETURN VALUE * CC: Y,A = bytes written * CS: A = EC *\-------------------------------------- -SKT.SendTo sec - .HS 90 BCC -SKT.Send clc - php - jsr SKT.PullhFDDataInPtrLen - plp - bcc .1 +SKT.Send jsr SKT.PullhFDDataInPtrLen - jsr SKT.PullRemAddr - -.1 ldy #S.SOCKET.T + ldy #S.SOCKET.T lda (ZPPtrSKT),y tax jmp (J.SKT.send,x) @@ -979,8 +992,7 @@ SKT.Send.9 rts * `>LIBCALL hLIBTCPIP,LIBTCPIP.GetSockOpt` * ## RETURN VALUE *\-------------------------------------- -SKT.getsockopt >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT +SKT.getsockopt jsr SKT.GetFD ldy #S.SOCKET.O lda (ZPPtrSKT),y * clc @@ -992,14 +1004,17 @@ SKT.getsockopt >SYSCALL2 GetMemPtr * `int setsockopt(hFD fd, short int opts);` * ## ASM * **In:** -* `>PUSHBI opts` -* `lda fd` +* `>PUSHB fd` +* `>PUSHB opts` * `>LIBCALL hLIBTCPIP,LIBTCPIP.SetSockOpt` * ## RETURN VALUE *\-------------------------------------- -SKT.setsockopt >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT - >PULLA +SKT.setsockopt >PULLA + pha + + jsr SKT.PullhFD + + pla ldy #S.SOCKET.O sta (ZPPtrSKT),y * clc @@ -1017,10 +1032,9 @@ SKT.setsockopt >SYSCALL2 GetMemPtr * CC : A = 0 if some data, A = $ff if EOF * CS : A = Socket Error *\-------------------------------------- -SKT.EOF >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT +SKT.EOF jsr SKT.GetFD -SKT.EOF.I ldy #S.SOCKET.TCP.INUSED + ldy #S.SOCKET.TCP.INUSED lda (ZPPtrSKT),y iny ora (ZPPtrSKT),y @@ -1034,7 +1048,8 @@ SKT.EOF.I ldy #S.SOCKET.TCP.INUSED rts .8 lda #0 ...EOF = false - clc + +* clc .9 rts *-------------------------------------- SKT.CheckStream lda #S.SOCKET.T.STREAM @@ -1085,10 +1100,13 @@ SKT.GetTable >LDYA L.SKT.Table rts *-------------------------------------- SKT.PullhFDDataInPtrLen - >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT - >PULLW ZPDataInPtr !!!DataOut trashed when sending ACK in TCP.OUT >PULLW ZPDataInLen !!!use DataInPtr/Len + >PULLW ZPDataInPtr !!!DataOut trashed when sending ACK in TCP.OUT + +SKT.PullhFD >PULLA + +SKT.GetFD >SYSCALL2 GetMemPtr + >STYA ZPPtrSKT rts *-------------------------------------- SKT.PullLocAddr clc @@ -1100,6 +1118,7 @@ SKT.PullRemAddr sec ldx #S.SOCKADDR-1 bcc .1 + ldx #S.SOCKADDR+S.SOCKADDR-1 .1 lda (ZPTmpPtr1),y @@ -1140,8 +1159,7 @@ SKT.FindMatchingLocRem beq .8 phx - >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT + jsr SKT.GetFD plx ldy #S.SOCKET.AF diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index 75ba7786..ed13c895 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -1,6 +1,5 @@ NEW AUTO 3,1 - .LIST OFF *-------------------------------------- TCP.IN jsr FRM.GetTargetSKT.TCPUDP jsr SKT.FindMatchingLocRem @@ -91,11 +90,12 @@ TCP.IN.JMP.SYNSENT jsr TCP.IN.ACKTheSYN - lda #S.TCP.OPTIONS.ACK - jsr TCP.OUT.SendOptA SYN.ACK received, Send, ACK + jsr TCP.OUT.SendACK SYN.ACK received, Send, ACK bcs .9 + lda #S.SOCKET.TCP.S.ESTBLSH jmp SKT.StoreTCB.S + .9 lda #S.TCP.OPTIONS.RST jsr TCP.OUT.SendOptA Send RST ldx SKT.Index @@ -120,9 +120,11 @@ TCP.IN.JMP.SYNRCVD sta SKT.Cache+S.SOCKET.TCP.OUTNEXTSEQ,x ...and update NEXTSEQ eor (ZPFrameInPtr),y bne .8 + dey dex bpl .1 + lda #S.SOCKET.TCP.S.ESTBLSH jmp SKT.StoreTCB.S @@ -266,9 +268,8 @@ TCP.IN.JMP.LASTACK lda (ZPFrameInPtr),y bit #S.TCP.OPTIONS.ACK beq .8 - - lda #S.TCP.OPTIONS.ACK - jsr TCP.OUT.SendOptA + + jsr TCP.OUT.SendACK ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.TIMEWT @@ -296,8 +297,8 @@ TCP.IN.JMP.FINWT1 .1 jsr TCP.IN.ACKTheFIN FIN/ACK * lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK - lda #S.TCP.OPTIONS.ACK - jsr TCP.OUT.SendOptA FIN received, Send ACK + + jsr TCP.OUT.SendACK FIN received, Send ACK bcs TCP.IN.JMP.TIMEWT.RTS lda #S.SOCKET.TCP.S.LASTACK @@ -313,9 +314,7 @@ TCP.IN.JMP.FINWT2 jsr TCP.IN.ACKTheFIN - lda #S.TCP.OPTIONS.ACK - - jsr TCP.OUT.SendOptA FIN received, Send ACK + jsr TCP.OUT.SendACK FIN received, Send ACK bcs TCP.IN.JMP.TIMEWT.RTS lda #S.SOCKET.TCP.S.TIMEWT @@ -409,8 +408,7 @@ TCP.SENDCLOSE ldx #0 lda SKT.TABLE,x beq .8 - >SYSCALL2 GetMemPtr - >STYA ZPPtrSKT + jsr SKT.GetFD ldy #S.SOCKET.AF lda (ZPPtrSKT),y @@ -450,10 +448,6 @@ TCP.SENDCLOSE ldx #0 lda #S.SOCKET.TCP.S.SYNSENT jsr SKT.StoreTCB.S bra .8 - - lda #S.TCP.OPTIONS.SYN - jsr TCP.OUT.SendOptA Send SYN - bra .8 *-------------------------------------- .4 cpx #S.SOCKET.T.SEQPKT bne .6 @@ -539,6 +533,8 @@ TCP.OUT.SEQSEND ldy #S.TCP.WINDOW jmp SKT.StoreTCB exits with CC *-------------------------------------- +TCP.OUT.SendACK lda #S.TCP.OPTIONS.ACK + TCP.OUT.SendOptA jsr TCP.SetSocketTCPO @@ -607,12 +603,14 @@ TCP.SetSocketTCPO TCP.NewFrame ldx #S.IP.PROTOCOL.TCP jsr FRM.NewIP bcs .9 + jsr SKT.SetFrameOutDstIP jsr SKT.SetFrameOutTCPUDPPorts ldy #S.TCP.DATAOFFSET lda #$50 Header size = 5 DWORDS sta (ZPFrameOutPtr),y + clc .9 rts *-------------------------------------- @@ -624,9 +622,12 @@ TCP.AddAYToSktCacheAtX adc SKT.Cache+2,x sta SKT.Cache+2,x bcc .8 + inc SKT.Cache+1,x bne .8 + inc SKT.Cache,x + .8 rts *-------------------------------------- MAN diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 13ebe850..bd32c259 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -167,22 +167,22 @@ LIB.LOAD ldx RefCount jsr ARP.Clear.I + >PUSHBI S.SOCKET.T.DGRAM >PUSHBI 0 no protocol - lda #S.SOCKET.T.DGRAM jsr SKT.Socket bcs .9 sta hDNSSocket + >PUSHA >PUSHW L.SA.LOCAL IP/PORT=All ZERO - lda hDNSSocket jsr SKT.Bind >LDYAI UDP.PORT.DNS >STYA SA.REMOTE+S.SOCKADDR.PORT + >PUSHB hDNSSocket >PUSHW L.SA.REMOTE IP=All ZERO - lda hDNSSocket jsr SKT.Connect jsr DNS.CLEAR @@ -256,17 +256,20 @@ PULSE and #S.EVT.F.T1SEC *-------------------------------------- GetDynPort inc DYNPORT.LAST bne .1 + inc DYNPORT.LAST+1 lda DYNPORT.LAST cmp #K.DYNPORT.END lda DYNPORT.LAST+1 sbc /K.DYNPORT.END bcs .1 + lda #K.DYNPORT.START ldx /K.DYNPORT.START sta DYNPORT.LAST stx DYNPORT.LAST+1 rts CC + .1 lda DYNPORT.LAST ldx DYNPORT.LAST+1 clc @@ -303,13 +306,13 @@ SA.REMOTE .DA #AF.INET S.SOCKADDR.AF .BS 2 S.SOCKADDR.PORT *-------------------------------------- FD.DSOCK .DA #S.FD.T.DSOCK - .DA #0 S.FD.HANDLER - .BS 1 S.FD.DSOCK.IOHANDLER + .DA #0 S.FD.PFT + .BS 1 S.FD.DSOCK.IOH .DA #0 S.FD.DSOCK.OPEN .DA #LIBTCPIP.shutdown .DA #LIBTCPIP.Recv .DA #LIBTCPIP.Send - .DA #0 S.FD.DSOCK.STATUS + .DA #0 S.FD.DSOCK.EOF *-------------------------------------- .DA #AF.INET S.SOCKET.AF .BS 1 S.SOCKET.T @@ -317,8 +320,8 @@ FD.DSOCK .DA #S.FD.T.DSOCK FD.DSOCK.SIZE .EQ *-FD.DSOCK *-------------------------------------- FD.SSOCK .DA #S.FD.T.SSOCK - .DA #0 S.FD.HANDLER - .BS 1 S.FD.SSOCK.IOHANDLER + .DA #0 S.FD.PFT + .BS 1 S.FD.SSOCK.IOH .DA #0 S.FD.SSOCK.OPEN .DA #LIBTCPIP.shutdown .DA #LIBTCPIP.Read diff --git a/SBIN/CIFSD.S.txt b/SBIN/CIFSD.S.txt index f22cbc95..e5208582 100644 --- a/SBIN/CIFSD.S.txt +++ b/SBIN/CIFSD.S.txt @@ -128,17 +128,17 @@ CS.RUN lda hSocket bcs .9 sta hMount - + >PUSHW L.MSG.MOUNTED - + lda #2 >SYSCALL ArgV >PUSHYA - + lda #3 >SYSCALL ArgV >PUSHYA - + >PUSHBI 4 >SYSCALL PrintF @@ -233,15 +233,15 @@ CS.RUN.CheckArgs CS.RUN.CheckArgs.RTS rts *-------------------------------------- -CS.RUN.Connect >PUSHBI 0 no protocol - lda #S.SOCKET.T.SEQPKT +CS.RUN.Connect >PUSHBI S.SOCKET.T.SEQPKT + >PUSHBI 0 no protocol >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket + >PUSHA >PUSHEA.G SA.LOCAL - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 @@ -250,8 +250,8 @@ CS.RUN.Connect >PUSHBI 0 no protocol .1 >SLEEP + >PUSHB hSocket >PUSHEA.G SA.REMOTE - lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcc .8 @@ -259,7 +259,7 @@ CS.RUN.Connect >PUSHBI 0 no protocol bne .1 .9 pha - + >PUSHW L.MSG.NOCONN lda #1 >SYSCALL ArgV diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 99900e7f..ecb307ac 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -70,6 +70,7 @@ CS.RUN ldy #S.PS.ARGC lda ArgIndex >SYSCALL ArgV bcs .8 + >STYA ZPPtr1 jsr CkeckOption @@ -146,9 +147,9 @@ CS.RUN.LOOP1 >SLEEP ldy #S.PS.hStdIn lda (pPS),y - >SYSCALL FEOF bcs CS.RUN.9 I/O error + tay bne .1 no char @@ -239,6 +240,7 @@ CS.RUN.IAC.SB >SYSCALL GetChar Wait for IAC SB.IS or SEND cmp #IAC beq .4 end of DATA, go wait SE + ldy IAC.SB.LEN sta (pData),y iny @@ -247,15 +249,19 @@ CS.RUN.IAC.SB >SYSCALL GetChar Wait for IAC SB.IS or SEND sty IAC.SB.LEN cpy #IAC.BUF.MAX bne .2 + bra .8 + .4 >SYSCALL GetChar bcs .9 + cmp #SE bne .8 lda IAC.SUBCMD cmp #TN.O.TTYPE bne .8 + lda IAC.SB.CMD cmp #SB.IS bne .8 @@ -268,8 +274,7 @@ CS.RUN.IAC.SB >SYSCALL GetChar Wait for IAC SB.IS or SEND *-------------------------------------- CS.RUN.GREETINGS >PUSHW L.MSG.GREETINGS - >PUSHB #K.VER - >PUSHB /K.VER + >PUSHW A2osX.KVER lda ArgDev >SYSCALL ArgV >PUSHYA @@ -282,7 +287,9 @@ CS.DOEVENT lda (pEvent) lda TimeOut beq .9 + dec TimeOut + .9 sec do not discard TIMER event rts *-------------------------------------- @@ -290,6 +297,7 @@ CS.QUIT lda hFILE beq .8 >SYSCALL FClose + .8 clc rts *-------------------------------------- diff --git a/SBIN/HTTPD.S.txt b/SBIN/HTTPD.S.txt index 91c4fb6f..7ada3ce6 100644 --- a/SBIN/HTTPD.S.txt +++ b/SBIN/HTTPD.S.txt @@ -109,7 +109,7 @@ CS.RUN >LDYA L.MSG.TCPWAIT lda #TIMEOUT.MAX sta TimeOut - + .1 >SLEEP >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? bcs .99 @@ -125,6 +125,7 @@ CS.RUN >LDYA L.MSG.TCPWAIT lda (pPS),y >SYSCALL FEOF bcs CS.RUN.RTS I/O err + tay bne .1 @@ -141,7 +142,7 @@ CS.RUN >LDYA L.MSG.TCPWAIT >SYSCALL PutS CS.RUN.SYN lda #E.SYN - sec + sec CS.RUN.RTS rts *-------------------------------------- CS.RUN.INIT ldx #3 @@ -156,32 +157,32 @@ CS.RUN.INIT ldx #3 >LDYAI 256 >SYSCALL GetMem bcs CS.RUN.RTS - + >STYA ZPLinePtr stx hLineBuf - + >PUSHW L.MSG.INITCONF >PUSHW L.ETCHTTPDCONF >PUSHBI 2 - + >SYSCALL PrintF bcs CS.RUN.RTS - + jsr CS.RUN.CONF bcs CS.RUN.RTS - + + >PUSHBI S.SOCKET.T.SEQPKT >PUSHBI 0 no protocol - lda #S.SOCKET.T.SEQPKT >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs CS.RUN.RTS sta hSrvSocket + >PUSHB hSrvSocket >PUSHW L.SA.LOCAL - lda hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs CS.RUN.ERR - + lda hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Listen bcs CS.RUN.ERR @@ -189,8 +190,8 @@ CS.RUN.INIT ldx #3 >PUSHW L.MSG.INITOK >PUSHW SA.LOCAL+S.SOCKADDR.PORT >PUSHW ZPRootDirPtr - >PUSHBI 4 - + >PUSHBI 4 + >SYSCALL PrintF *-------------------------------------- CS.RUN.LOOP >SLEEP @@ -201,7 +202,7 @@ CS.RUN.LOOP >SLEEP CS.RUN.ERR >LDYA L.MSG.SKTERR >SYSCALL PutS lda #E.SYN - sec + sec rts *-------------------------------------- CS.RUN.CONF >PUSHW L.ETCHTTPDCONF @@ -221,53 +222,53 @@ CS.RUN.CONF >PUSHW L.ETCHTTPDCONF tya beq .1 - + lda (ZPLinePtr) cmp #'#' beq .1 - + >LDYA L.KEYWORDS.CONF >STYA ZPPtr1 - + ldx #0 .2 ldy #0 - + .3 lda (ZPPtr1),y cmp (ZPLinePtr),y bne .4 - + iny cmp #C.SPACE bne .3 - + jsr CS.RUN.CONF.JMP bcc .1 - + bra .97 - + .4 inx inx - + ldy #0 - + .5 iny lda (ZPPtr1),y cmp #C.SPACE bne .5 - + tya sec adc ZPPtr1 sta ZPPtr1 bcc .6 inc ZPPtr1+1 - + .6 lda (ZPPtr1) bne .2 .97 lda #E.SYN - + .98 pha jsr .8 pla @@ -286,13 +287,13 @@ CS.RUN.CONF.JMP tya lda #0 adc ZPLinePtr+1 sta ZPPtr1+1 - - jmp (J.KEYWORDS.CONF,x) + + jmp (J.KEYWORDS.CONF,x) CS.RUN.CONF.SERVERNAME >SYSCALL StrDup bcs .9 - + >STYA ZPSrvNamePtr stx hSrvName @@ -309,7 +310,7 @@ CS.RUN.CONF.DOCUMENTROOT >PUSHWI 0 Allocate >SYSCALL RealPath bcs .9 - + >STYA ZPRootDirPtr stx hRootdir @@ -318,7 +319,7 @@ CS.RUN.CONF.DOCUMENTROOT CS.RUN.SERVER lda hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Accept bcs .8 - + sta CLN.hSocket >SYSCALL GetMemPtr >STYA ZPSktPtr @@ -344,10 +345,10 @@ CS.RUN.SERVER lda hSrvSocket >PUSHB CLN.hSocket >PUSHBI 1 >SYSCALL PrintF - + lda CLN.hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown - + .8 clc .9 CS.RUN.SERVER.RTS @@ -356,10 +357,10 @@ CS.RUN.SERVER.RTS CS.RUN.CLIENT >LDYAI 1024 >SYSCALL GetMem bcs CS.RUN.SERVER.RTS - + >STYA ZPRepPtr stx REP.hBuf - + .10 >STZ.G REQ.FullPath stz REQ.hReq stz REQ.KeepAlive @@ -380,84 +381,84 @@ CS.RUN.CLIENT >LDYAI 1024 .3 jsr CS.RUN.REQ.GetLine bcs .4 - + >LDYA ZPLinePtr >STYA ZPPtr2 >LDYA L.KEYWORDS.REQ jsr CS.RUN.GET.KW bcs .3 - + jsr CS.RUN.REQ.JMP bcc .3 bcs .98 - + .4 lda REQ.hReq >SYSCALL FreeMem - + stz REQ.hReq >LDA.G REQ.FullPath beq .9 - + jsr CS.RUN.OpenFile bcs .9 - + jsr CS.RUN.SendFile bcs .99 - + bra .8 -.9 >PUSHWI HTTP.404.len +.9 >PUSHB CLN.hSocket >PUSHW L.HTTP.404 - lda CLN.hSocket + >PUSHWI HTTP.404.len >LIBCALL hLIBTCPIP,LIBTCPIP.Send - + .8 bit REQ.KeepAlive bpl .99 jmp .10 .98 lda REQ.hReq beq .99 - + >SYSCALL FreeMem .99 lda REP.hBuf >SYSCALL FreeMem - + rts *-------------------------------------- CS.RUN.REQ.GetReq sta REQ.hReq >SYSCALL GetMemPtr >STYA ZPRequestPtr - + >PUSHW L.MSG.REQ >PUSHB REQ.hReq >PUSHB CLN.hSocket >PUSHBI 2 >SYSCALL PrintF - + ldy #S.IP.TOTAL.LENGTH+1 lda (ZPRequestPtr),y sec sbc #S.TCP-S.IP eor #$ff sta ZPnRequestLen - + dey - + lda (ZPRequestPtr),y sbc /S.TCP-S.IP eor #$ff sta ZPnRequestLen+1 - + lda ZPRequestPtr clc adc #S.TCP sta ZPRequestPtr bcc .8 - + inc ZPRequestPtr+1 .8 rts *-------------------------------------- @@ -473,15 +474,15 @@ CS.RUN.REQ.GetLine inc ZPRequestPtr bne .21 inc ZPRequestPtr+1 - + .21 cmp #C.CR bne .4 - + inc ZPnRequestLen bne .3 inc ZPnRequestLen+1 beq .9 - + .3 lda (ZPRequestPtr) inc ZPRequestPtr bne .31 @@ -493,11 +494,11 @@ CS.RUN.REQ.GetLine sta (ZPLinePtr),y Y,A = StrLen clc rts - + .4 sta (ZPLinePtr),y iny bra .1 - + .9 sec rts *-------------------------------------- @@ -506,58 +507,58 @@ CS.RUN.OpenFile >PUSHW L.MSG.FILE >PUSHEA.G REQ.FullPath >PUSHBI 3 >SYSCALL PrintF - + >PUSHEA.G REQ.FullPath >PUSHBI O.RDONLY >PUSHBI 0 type >PUSHWZ Aux type >SYSCALL FOpen bcs .9 - + stx REQ.hFile - + >PUSHA >PUSHEA.G REQ.Stat >SYSCALL FStat - + >LEA.G REQ.FullPath >STYA ZPPtr2 ldx #$ff ldy #$ff - + .1 iny lda (ZPPtr2),y beq .2 - + cmp #'.' bne .1 - + tya tax bra .1 .2 txa bpl .3 - + lda #MIME.DEFAULT.ID bra .8 - + .3 sec adc ZPPtr2 sta ZPPtr2 bcc .4 - + inc ZPPtr2+1 - + .4 >LDYA L.MIME.TYPES jsr CS.RUN.GET.KW - + txa - + .8 sta REQ.MimeType - + clc .9 rts *-------------------------------------- @@ -568,28 +569,28 @@ CS.RUN.SendFile >PUSHW ZPRepPtr >PUSHW T.MIME,x >PUSHL.G REQ.Stat+S.STAT.SIZE >PUSHBI 6 - + >SYSCALL SPrintF bcs .9 - + jsr CS.RUN.SendBuf Y,A = car count - + .1 >PUSHB REQ.hFile >PUSHW ZPRepPtr >PUSHWI 1024 >SYSCALL FRead bcs .8 - + jsr CS.RUN.SendBuf bcs .9 bra .1 - + .8 cmp #MLI.E.EOF bne .9 clc - + .9 php pha lda REQ.hFile @@ -598,9 +599,11 @@ CS.RUN.SendFile >PUSHW ZPRepPtr plp rts *-------------------------------------- -CS.RUN.SendBuf >PUSHYA +CS.RUN.SendBuf pha + >PUSHB CLN.hSocket >PUSHW ZPRepPtr - lda CLN.hSocket + pla + >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.Send rts *-------------------------------------- @@ -610,32 +613,32 @@ CS.RUN.REQ.GET ldy #0 .1 iny lda (ZPPtr2),y - + eor #C.SPACE bne .1 - + sta (ZPPtr2),y lda (ZPPtr2) cmp #'/' bne .4 - + >PUSHEA.G REQ.FullPath >PUSHW ZPRootDirPtr >SYSCALL StrCpy >PUSHEA.G REQ.FullPath - + ldy #1 lda (ZPPtr2),y bne .2 - + >LDYA L.INDEX.HTML bra .3 - + .2 >LDYA ZPPtr2 - + .3 >PUSHYA >SYSCALL StrCat rts @@ -649,11 +652,11 @@ CS.RUN.REQ.Connection lda (ZPPtr2) eor #'k' beq .1 - - + + lda #$ff - -.1 sta REQ.KeepAlive + +.1 sta REQ.KeepAlive clc rts @@ -663,18 +666,18 @@ CS.RUN.GET.KW >STYA ZPPtr1 ldx #0 .2 ldy #$ff - + .3 iny lda (ZPPtr1),y cmp (ZPPtr2),y bne .4 - + cmp #0 beq .33 - + cmp #C.SPACE bne .3 - + .33 tya sec adc ZPPtr2 @@ -684,23 +687,23 @@ CS.RUN.GET.KW >STYA ZPPtr1 .8 clc rts - + .4 inx inx - + ldy #0 - + .5 iny lda (ZPPtr1),y bne .5 - + tya sec adc ZPPtr1 sta ZPPtr1 bcc .6 inc ZPPtr1+1 - + .6 lda (ZPPtr1) bne .2 @@ -718,12 +721,12 @@ CS.DOEVENT lda (pEvent) *-------------------------------------- CS.QUIT lda hSrvSocket beq .1 - + >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown .1 lda hLineBuf beq .2 - + >SYSCALL FreeMem diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index 484a08ef..58d29432 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -100,7 +100,7 @@ CS.RUN lda #TIMEOUT.MAX >LDYA L.MSG.TCPIPERR >SYSCALL PutS pla - sec + sec .9 rts CS.RUN.INIT ldx #3 @@ -118,15 +118,15 @@ CS.RUN.INIT ldx #3 >SYSCALL AToI >STYA SA.LOCAL+S.SOCKADDR.PORT -CS.RUN.PORTOK >PUSHBI 0 no protocol - lda #S.SOCKET.T.STREAM +CS.RUN.PORTOK >PUSHBI S.SOCKET.T.STREAM + >PUSHBI 0 no protocol >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSrvSocket + >PUSHA >PUSHW L.SA.LOCAL - lda hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 @@ -146,7 +146,7 @@ CS.RUN.PORTOK >PUSHBI 0 no protocol pha jsr CS.RUN.CLIENT pla - + bcc .2 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown bra .2 @@ -155,7 +155,7 @@ CS.RUN.PORTOK >PUSHBI 0 no protocol >LDYA L.MSG.SKTERR >SYSCALL PutS pla - sec + sec rts *-------------------------------------- CS.RUN.CLIENT >SLEEP give some time for TCPIP SYN/ACK diff --git a/SYS/KERNEL.S.BLISTX.txt b/SYS/KERNEL.S.BLISTX.txt index 41534eb9..dd5719ce 100644 --- a/SYS/KERNEL.S.BLISTX.txt +++ b/SYS/KERNEL.S.BLISTX.txt @@ -41,7 +41,10 @@ BLISTX.Free pha .1 lda $ffff,x SELF MODIFIED beq .8 + phx jsr K.FreeMem + + plx inx bra .1 diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index b59413ac..edab5023 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -57,22 +57,17 @@ K.GetDevByName >STYA ZPPtr1 requested dev name bcs .7 lda Nod.Table.hFD-2,x - jsr K.GetMemPtr Y,A = pPD, X = hDevNod - - >STYA pFD for IO.Open - -* clc - rts + jmp K.GetMemPtr Y,A = pPD, X = hDevNod .7 inx inx cpx #K.NOD.MAX*2+2 bne .5 -.9 lda #MLI.E.NODEV - sec + lda #MLI.E.NODEV +* sec rts -*-------------------------------------- +*-------------------------------------- .8 >STYA ZPPtr2 ldy #$ff @@ -87,9 +82,9 @@ K.GetDevByName >STYA ZPPtr1 requested dev name clc rts - -.89 sec - + +.89 sec + K.GetDev.9 rts */-------------------------------------- * # GetDevStatus @@ -122,6 +117,37 @@ DEV.GetStatus sta K.S.IOCTL+S.IOCTL.S ldx #IOCTL.STATUS *-------------------------------------- DEV.pDrvJmp jmp (pDrv) +*-------------------------------------- +DEV.OPEN ldx #IOCTL.OPEN + lda IO.hDevNod + jsr DEV.pDrvJmp + bcs .9 + + lda IO.hDevNod + +.9 rts +*-------------------------------------- +DEV.CLOSE ldx #IOCTL.CLOSE + lda IO.hDevNod + jmp (pDrv) +*-------------------------------------- +DEV.READ ldx #IOCTL.READ + .HS 2C BIT ABS +*-------------------------------------- +DEV.WRITE ldx #IOCTL.WRITE + + >PULLW K.S.IOCTL+S.IOCTL.BYTECNT + >PULLW K.S.IOCTL+S.IOCTL.BUFPTR + + inc pStack pop hFD + + >LDYAI K.S.IOCTL + jsr DEV.pDrvJmp + bcs .9 + + >LDYA K.S.IOCTL+S.IOCTL.BYTECNT + +.9 rts */-------------------------------------- * # MKDev * Create a hDEV @@ -147,7 +173,7 @@ K.MKDev jsr SHARED.PullP2P1 ptr2=name,tr1=fd bne .10 bra .9 - + .11 stx IO.hDevNod ldy #$ff @@ -257,9 +283,9 @@ K.IOCTL ldy #3 hDev .9 >RET 4 *-------------------------------------- DEV.GetPFD sta IO.hDevNod - + tax - + lsr bcs .1 @@ -324,12 +350,12 @@ DEV.MkFD.T .DA #S.FD.T.REG,#S.FD.T.DIR,#S.FD.T.PIPE DEV.Destroy ldx IO.hDevNod lda Nod.Table.hName-2,x beq .1 - + stz Nod.Table.hName-2,x jsr K.FreeMem - + ldx IO.hDevNod - + .1 lda Nod.Table.hFD-2,x stz Nod.Table.hFD-2,x jmp K.FreeMem diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index 8ff1c165..aae693de 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -337,7 +337,7 @@ K.FreeMem.ERR >PUSHWI K.FreeMem.MSG tya hMem n Y >PUSHA - +* >DEBUG ldy #S.PS.PID lda (pPS),y >PUSHA diff --git a/SYS/KERNEL.S.PIPE.txt b/SYS/KERNEL.S.PIPE.txt index d7fa5cf8..d7b25dea 100644 --- a/SYS/KERNEL.S.PIPE.txt +++ b/SYS/KERNEL.S.PIPE.txt @@ -7,7 +7,6 @@ PIPE.CNT .EQ ZPDRV+4 PIPE.BASEH .EQ ZPDRV+6 PIPE.BUFH .EQ ZPDRV+7 PIPE.SIZEH .EQ ZPDRV+8 -PIPE.nCNT .EQ ZPDRV+10 *-------------------------------------- PIPE.OPEN ldy #S.FD.PIPE.S lda (pFD),y @@ -40,8 +39,8 @@ PIPE.CLOSE ldy #S.FD.PIPE.S *-------------------------------------- PIPE.WRITE ldy #S.FD.PIPE.S lda (pFD),y - bpl .10 + jmp PIPE.eEOF Remote PS closed the Pipe .10 ldy #S.FD.PIPE.Free @@ -233,7 +232,7 @@ PIPE.READ ldy #S.FD.PIPE.Used+1 jsr PIPE.SubCnt PIPE.EXIT >LDYA PIPE.CNT Y,A = bytes written - inc pStack + inc pStack Discard hFILE clc rts *-------------------------------------- diff --git a/SYS/KERNEL.S.SOCK.txt b/SYS/KERNEL.S.SOCK.txt new file mode 100644 index 00000000..9a78bf95 --- /dev/null +++ b/SYS/KERNEL.S.SOCK.txt @@ -0,0 +1,52 @@ +NEW + AUTO 3,1 +*-------------------------------------- +SOCK.OPEN lda IO.hDevNod + clc + rts +*-------------------------------------- +SOCK.CLOSE ldy #S.FD.SSOCK.CLOSE + .HS 2C BIT ABS +*-------------------------------------- +SOCK.EOF ldy #S.FD.SSOCK.EOF + jsr SOCK.SETUP +SOCK.JMP jmp (pDrv) +*-------------------------------------- +SOCK.READ ldy #S.FD.SSOCK.READ + .HS 2C BIT ABS +*-------------------------------------- +SOCK.WRITE ldy #S.FD.SSOCK.WRITE + jsr SOCK.SETUP + + >PUSHA hFD + + phx + + ldx #4 + ldy #4 + +.1 lda (pStack),y + >PUSHA + dex + bne .1 + + plx + jsr SOCK.JMP + + >RET 5 +*-------------------------------------- +SOCK.SETUP lda (pFD),y + tax Function Offset in LIB + + ldy #S.FD.SSOCK.IOH + lda (pFD),y + jsr K.GetMemPtr + >STYA pDrv + + lda IO.hFD + rts +*-------------------------------------- +MAN +SAVE usr/src/sys/kernel.s.sock +LOAD usr/src/sys/kernel.s +ASM diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 0d333b12..f962701c 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -54,7 +54,7 @@ STDIO.Put1 >PUSHWI K.IOBuf buf inc write 1 byte >PUSHA - jsr K.FWrite +STDIO.Write jsr K.FWrite bcc .9 tay @@ -108,15 +108,7 @@ K.PutS >STYA .1+1 txa >PUSHA - jsr K.FWrite - bcc .99 - - tay - bne .99 - - >POP 5 pop hFile, buffer & len - -.99 rts + bra STDIO.Write */-------------------------------------- * # fputs (BLOCKING) * Write Str to hFILE @@ -166,14 +158,8 @@ K.FPutS lda (pStack) pla >PUSHA push len LO - jsr K.Write - bcc .8 - - tay - bne .8 - - >POP 5 - rts + jsr STDIO.Write + bcs K.FPutS.RTS .8 >POP 2 @@ -381,10 +367,10 @@ K.FOpen jsr PFT.CheckPath4 inc pStack discard filename inc pStack - jmp IO.Open + jmp UNISTD.Open .9 >POP 6 -.99 rts + rts */-------------------------------------- * # FClose * Close a file @@ -399,7 +385,7 @@ K.FOpen jsr PFT.CheckPath4 K.FClose jsr PFT.CheckNodeA bcs K.FRead.RTS - jmp IO.Close + jmp UNISTD.Close */-------------------------------------- * # FRead (BLOCKING) * Read bytes from file @@ -577,7 +563,7 @@ K.FEOF jsr PFT.CheckNodeA .DA STDIO.IOERR BDEV .DA STDIO.IOERR LNK .DA STDIO.IOERR DSOCK - .DA IO.EOF.SSOCK + .DA SOCK.EOF .DA PIPE.EOF */-------------------------------------- * # FTell diff --git a/SYS/KERNEL.S.UNISTD.txt b/SYS/KERNEL.S.UNISTD.txt index a7bfec0b..514b490c 100644 --- a/SYS/KERNEL.S.UNISTD.txt +++ b/SYS/KERNEL.S.UNISTD.txt @@ -21,13 +21,14 @@ K.Open jsr PFT.CheckPath1 stz IO.Open.AUXTYPE stz IO.Open.AUXTYPE+1 *-------------------------------------- -IO.Open ldx #5 /dev/ +UNISTD.Open ldx #5 /dev/ cpx K.MLI.PATH bcs .8 .1 lda K.MLI.PATH,x cmp IO.DEV-1,x bne .8 + dex bne .1 *-------------------------------------- @@ -37,8 +38,10 @@ IO.Open ldx #5 /dev/ jsr K.GetDevByName bcs .9 -*-------------------------------------- - stx IO.hDevNod pFD set by GetDevByName + + >STYA pFD + + stx IO.hDevNod lda (pFD) #S.FD.T tax @@ -47,11 +50,11 @@ IO.Open ldx #5 /dev/ .2 * .DA STDIO.IOERR REG .DA STDIO.IOERR DIR - .DA IO.OPEN.DEV - .DA IO.OPEN.DEV + .DA DEV.OPEN + .DA DEV.OPEN .DA STDIO.IOERR LNK - .DA IO.OPEN.SOCK - .DA IO.OPEN.SOCK + .DA SOCK.OPEN + .DA SOCK.OPEN .DA PIPE.OPEN .8 jmp FS.OPEN.REG @@ -68,16 +71,16 @@ IO.Open ldx #5 /dev/ *\-------------------------------------- K.Close jsr DEV.GetPFD -IO.Close lda (pFD) #S.FD.T +UNISTD.Close lda (pFD) #S.FD.T tax jmp (.1,x) .1 .DA FS.CLOSE.REG .DA FS.CLOSE.DIR - .DA IO.CLOSE.DEV - .DA IO.CLOSE.DEV + .DA DEV.CLOSE + .DA DEV.CLOSE .DA STDIO.IOERR LNK - .DA IO.CLOSE.SOCK - .DA IO.CLOSE.SOCK + .DA SOCK.CLOSE + .DA SOCK.CLOSE .DA PIPE.CLOSE */-------------------------------------- * # read @@ -103,11 +106,11 @@ UNISTD.Read lda (pFD) #S.FD.T jmp (.1,x) .1 .DA FS.READ.REG .DA STDIO.IOERR DIR - .DA IO.READ.CDEV + .DA DEV.READ .DA STDIO.IOERR BDEV .DA STDIO.IOERR LNK .DA STDIO.IOERR DSOCK - .DA IO.READ.SSOCK + .DA SOCK.READ .DA PIPE.READ */-------------------------------------- * # write @@ -133,65 +136,12 @@ UNISTD.Write lda (pFD) #S.FD.T jmp (.1,x) .1 .DA FS.WRITE.REG .DA STDIO.IOERR DIR - .DA IO.WRITE.CDEV + .DA DEV.WRITE .DA STDIO.IOERR BDEV .DA STDIO.IOERR LNK .DA STDIO.IOERR DSOCK - .DA IO.WRITE.SSOCK + .DA SOCK.WRITE .DA PIPE.WRITE -*-------------------------------------- -IO.OPEN.DEV ldx #IOCTL.OPEN - lda IO.hDevNod - jsr DEV.pDrvJmp - bcs IO.RTS -*-------------------------------------- -IO.OPEN.SOCK lda IO.hDevNod - clc - -IO.RTS rts -*-------------------------------------- -IO.CLOSE.DEV ldx #IOCTL.CLOSE - lda IO.hDevNod - jmp DEV.pDrvJmp -*-------------------------------------- -IO.READ.CDEV ldx #IOCTL.READ - .HS 2C BIT ABS -*-------------------------------------- -IO.WRITE.CDEV ldx #IOCTL.WRITE - - >PULLW K.S.IOCTL+S.IOCTL.BYTECNT - >PULLW K.S.IOCTL+S.IOCTL.BUFPTR - - inc pStack pop hFD - - >LDYAI K.S.IOCTL - jsr DEV.pDrvJmp - bcs .9 - - >LDYA K.S.IOCTL+S.IOCTL.BYTECNT - -.9 rts -*-------------------------------------- -IO.CLOSE.SOCK ldy #S.FD.SSOCK.CLOSE - .HS 2C BIT ABS -*-------------------------------------- -IO.EOF.SSOCK ldy #S.FD.SSOCK.EOF - .HS 2C BIT ABS -*-------------------------------------- -IO.READ.SSOCK ldy #S.FD.SSOCK.READ - .HS 2C BIT ABS -*-------------------------------------- -IO.WRITE.SSOCK ldy #S.FD.SSOCK.WRITE - - lda (pFD),y - tax Function Offset in LIB - - ldy #S.FD.SSOCK.IOH - lda (pFD),y - jsr K.GetMemPtr - >STYA .1+1 - lda IO.hFD -.1 jmp $FFFF SELF MODIFIED */------------------------------------- * # LSeek * Set the file-position indicator for hFD @@ -204,7 +154,7 @@ IO.WRITE.SSOCK ldy #S.FD.SSOCK.WRITE * `>PUSHB whence` * `>SYSCALL fseek` *\------------------------------------- -K.LSeek +*K.LSeek */-------------------------------------- * # ChOwn diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 561be899..5d31ee32 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -81,6 +81,7 @@ D1.B .PH $D000 .INB usr/src/sys/kernel.s.unistd .INB usr/src/sys/kernel.s.stdio .INB usr/src/sys/kernel.s.dev + .INB usr/src/sys/kernel.s.sock .INB usr/src/sys/kernel.s.pipe .EP D1.S .EQ *-D1.B