From 34d23b68fccac543903a79387c561e88a870cd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 17 Jan 2019 15:05:48 +0000 Subject: [PATCH] Kernel 0.92 --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/IPCONFIG.S.DHCP.txt | 64 +++-- BIN/IPCONFIG.S.ETC.txt | 27 +- BIN/IPCONFIG.S.txt | 36 ++- BIN/MV.S.txt | 4 +- BIN/NETSTAT.S.txt | 2 +- BIN/RM.S.txt | 4 +- INC/LIB.NET.I.txt | 4 +- INC/LIBTCPIP.I.txt | 26 +- INC/NET.DHCP.I.txt | 1 + LIB/LIBTCPIP.S.CFG.txt | 68 +++-- LIB/LIBTCPIP.S.FRM.txt | 8 +- LIB/LIBTCPIP.S.txt | 1 + SBIN/DHCPCLNT.S.txt | 523 --------------------------------------- SBIN/NETWORKD.S.txt | 4 + SBIN/TCPIPD.S.txt | 74 ------ 16 files changed, 131 insertions(+), 715 deletions(-) delete mode 100644 SBIN/DHCPCLNT.S.txt delete mode 100644 SBIN/TCPIPD.S.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index b553517cc50e35faf5a64f2e015ef4beee9097e5..6e4e90de15606f1a32e19e33687c8d59a08535d5 100644 GIT binary patch delta 365197 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 zgh)apA(9YDh$KW3A_Bq5Rz zNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3 zA_Bq5RzNr)sw5+Vtagh)ap zA(9YDh$KW3A_Bq5RzNr)sw z5+Vtagh)apA(9YDh$KW3A_ zBq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YD zh$KW3A_Bq5RzNr)sw5+Vta zgh)apA(9YDh$KW3A_Bq5Rz zNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_Bq5RzNr)sw5+Vtagh)apA(9YDh$KW3 zA_Bq5RzNr)sw5+Vtagh)ap zA(9YDh$KW3A_Bq5RzNr)sw z5+Vtagh)apA(9YDh$KW3A_ zBq5RzNr)sw5+Vtagh)apA(9YDh$KW3A_LDYAI 256 >SYSCALL GetMem - bcs .9 - - >STYA ZPTmpPtr1 + bcc .1 + rts + +.1 >STYA ZPTmpPtr1 stx CFG.hBuf1 >LDYA L.HOSTNAME @@ -31,15 +32,18 @@ CFG.EtcFiles >LDYAI 256 beq .5 lda #S.IPCFG.STATUS.OK - sta IPCFG+S.IPCFG.STATUS + sta IPCFG+S.NETCFG.STATUS .5 >LDYA L.HOSTS jsr CFG.Read.PrintF jsr CFG.Read.HOSTS + >PUSHW L.IPCFG + >LIBCALL hLIBTCPIP,LIBTCPIP.SETCFG + lda CFG.hBuf1 >SYSCALL freemem - + .9 rts *-------------------------------------- CFG.Read.PrintF >PUSHYA @@ -296,19 +300,6 @@ CFG.Read.HOSTS.Scan *-------------------------------------- CFG.DNS.ADD >STYA ZPTmpPtr1 - >PUSHW ZPTmpPtr1 - - ldy #3 - -.1 lda CFG.IP,y - >PUSHA - dey - bpl .1 - - >PUSHBI 6 - >LDYA L.MSG.DNS.ADD - >SYSCALL printf - >LDYA L.CFG.IP >PUSHYA diff --git a/BIN/IPCONFIG.S.txt b/BIN/IPCONFIG.S.txt index a5f1d3a7..4a2d7732 100644 --- a/BIN/IPCONFIG.S.txt +++ b/BIN/IPCONFIG.S.txt @@ -13,6 +13,7 @@ AUTO 4,1 .INB INC/MLI.E.I .INB INC/NIC.I .INB INC/ETH.I + .INB INC/LIB.NET.I .INB INC/LIBTCPIP.I .INB INC/NET.DHCP.I *-------------------------------------- @@ -73,7 +74,6 @@ L.MSG2.HOSTNAME .DA MSG2.HOSTNAME L.MSG.CFG .DA MSG.CFG L.MSG.CFG.KO .DA MSG.CFG.KO L.MSG.CFG.OK .DA MSG.CFG.OK -L.MSG.DNS.ADD .DA MSG.DNS.ADD L.HOSTNAME .DA HOSTNAME L.TCPIP.CONF .DA TCPIP.CONF L.HOSTS .DA HOSTS @@ -121,7 +121,7 @@ CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG dey bpl .1 - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID bne CS.RUN.SETUP >LDYA L.MSG.NODEV @@ -163,7 +163,7 @@ CS.RUN.SETUP sta (pData),y bra .1 -.4 lda IPCFG+S.IPCFG.STATUS +.4 lda IPCFG+S.NETCFG.STATUS bne .5 lda #$ff no config, force all @@ -189,15 +189,12 @@ CS.RUN.SETUP jsr DHCP.QUIT -.8 >PUSHW L.IPCFG - >LIBCALL hLIBTCPIP,LIBTCPIP.SETCFG - - lda #0 +.8 lda #0 sec rts *-------------------------------------- CS.RUN.DUMP >PUSHEA.G DIB - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID >SYSCALL GetDevStatus >LEA.G DCB.NIC @@ -207,7 +204,7 @@ CS.RUN.DUMP >PUSHEA.G DIB >PUSHEA.G IOCTL >PUSHBI IOCTL.STATUS - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID >SYSCALL IOCTL CS.RUN.DUMPNIC ldy #DCB.NIC+S.DCB.NIC.MAC+5 @@ -221,7 +218,7 @@ CS.RUN.DUMPNIC ldy #DCB.NIC+S.DCB.NIC.MAC+5 >PUSHEA.G DIB+S.DIB.IDS - ldx IPCFG+S.IPCFG.DevID + ldx IPCFG+S.NETCFG.DevID lda Dev.Table,x clc adc #S.FD.DEV @@ -231,7 +228,7 @@ CS.RUN.DUMPNIC ldy #DCB.NIC+S.DCB.NIC.MAC+5 >PUSHYA - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID >PUSHA >PUSHBI 11 >LDYA L.MSG1.DEV @@ -299,7 +296,7 @@ CS.RUN.LINK >LDYA L.MSG1.LINK.OK CS.RUN.DUMPIP >PUSHBI 0 >LDYA L.MSG2 >SYSCALL printf - lda IPCFG+S.IPCFG.STATUS + lda IPCFG+S.NETCFG.STATUS and #S.IPCFG.STATUS.OK beq .11 @@ -430,10 +427,9 @@ MSG2.GW .AZ " Gateway : %d.%d.%d.%d\r\n" MSG2.DNS .AZ " DNS : %d.%d.%d.%d,%d.%d.%d.%d\r\n" MSG2.HOSTNAME .AZ " Hostname : %s.%s\r\n" *-------------------------------------- -MSG.CFG .AZ "Reading %s..." +MSG.CFG .AZ "IPCONFIG:Reading %s..." MSG.CFG.KO .AZ "Not Found. [%h]\r\n" MSG.CFG.OK .AZ "OK." -MSG.DNS.ADD .AZ " - Adding static host %d.%d.%d.%d %s..." *-------------------------------------- HOSTNAME .AZ "${ROOT}ETC/HOSTNAME" TCPIP.CONF .AZ "${ROOT}ETC/TCPIP.CONF" @@ -450,11 +446,11 @@ CFG.Keywords >PSTR "address" CFG.IP.SScanF .AZ "%d.%d.%d.%d" CFG.HOST.SScanF .AZ "%d.%d.%d.%d %s %s" *-------------------------------------- -MSG.DHCP.CFG1 .AZ "Searching for DHCP servers..." -MSG.DHCP.CFG2 .AZ "Reply from DHCP Server at %d.%d.%d.%d, requesting...\r\n" -MSG.DHCP.KO .AZ "Time Out [%h].\r\n" -MSG.DHCP.OK .AZ "Success:[IP=%d.%d.%d.%d/%d.%d.%d.%d]\r\n" -MSG.DHCP.NA .AZ "TCPIP Already configured, exiting." +MSG.DHCP.CFG1 .AZ "IPCONFIG:Searching for DHCP servers..." +MSG.DHCP.CFG2 .AZ "IPCONFIG:Reply from DHCP Server at %d.%d.%d.%d, requesting...\r\n" +MSG.DHCP.KO .AZ "IPCONFIG:Time Out [%h].\r\n" +MSG.DHCP.OK .AZ "IPCONFIG:Success:[IP=%d.%d.%d.%d/%d.%d.%d.%d]\r\n" +MSG.DHCP.NA .AZ "IPCONFIG:TCPIP Already configured, exiting." *-------------------------------------- IPCFG .BS S.IPCFG CFG.hBuf1 .BS 1 @@ -498,7 +494,7 @@ DHCP.REQ.XID .BS 4 .HS 00000000 CIADDR DHCP.REQ.YIADDR .HS 00000000 .HS 00000000 SIADDR -DHCP.REQ.GIADDR .HS 00000000 + .HS 00000000 GIADDR DHCP.REQ.CHADDR .HS 00000000.00000000.00000000.00000000 .BS 64 SNAME .BS 128 FILE diff --git a/BIN/MV.S.txt b/BIN/MV.S.txt index 648f6df7..317eafdc 100644 --- a/BIN/MV.S.txt +++ b/BIN/MV.S.txt @@ -23,8 +23,8 @@ OptionList >PSTR "CRYQcryq" OptionVars .DA #bContinue,#bRecurse,#bNoConfirm,#bQuiet,#bContinue,#bRecurse,#bNoConfirm,#bQuiet *-------------------------------------- MSG.USAGE .AZ "Usage : MV [Src File/Dir, *,? wildcards allowed]\r\n -C : Continue on error\r\n -Q : Quiet\r\n -R : Recurse subdirectories\r\n -Y : Dont't prompt for override\r\n" -MSG.DIR .AZ "MV Dir :%S to %S..." -MSG.FILE .AZ "MV File:%S to %S..." +MSG.DIR .AZ "MV Dir :%s to %s..." +MSG.FILE .AZ "MV File:%s to %s..." MSG.OVERWRITE .AZ "Overwrite %S [Yes,No,All]?" MSG.OK .AZ "[OK]" MSG.ERR .AZ "[%h]\r\n" diff --git a/BIN/NETSTAT.S.txt b/BIN/NETSTAT.S.txt index 73cafbcb..9340cf7c 100644 --- a/BIN/NETSTAT.S.txt +++ b/BIN/NETSTAT.S.txt @@ -172,6 +172,7 @@ CS.QUIT lda hLIBTCPIP *-------------------------------------- CS.END LIBTCPIP .AZ "libtcpip" +hLIBTCPIP .BS 1 MSG0 .AZ "Type Prot Local Remote Options Status" MSG1 .AZ "%s %s %03d.%03d.%03d.%03d:%05D %03d.%03d.%03d.%03d:%05D %b %s\r\n" MSG1.T.RAW .AZ "RAW " @@ -197,7 +198,6 @@ MSG1.S.8 .AZ "FIN-WAIT-2" MSG1.S.9 .AZ "CLOSING" MSG1.S.10 .AZ "TIME-WAIT" MSG1.S.INV .AZ "???" -hLIBTCPIP .BS 1 *-------------------------------------- .DUMMY .OR 0 diff --git a/BIN/RM.S.txt b/BIN/RM.S.txt index de2a5570..96f25b73 100644 --- a/BIN/RM.S.txt +++ b/BIN/RM.S.txt @@ -23,8 +23,8 @@ OptionList >PSTR "CRYQcryq" OptionVars .DA #bContinue,#bRecurse,#bNoConfirm,#bQuiet,#bContinue,#bRecurse,#bNoConfirm,#bQuiet *-------------------------------------- MSG.USAGE .AZ "Usage : RM [File/Dir, *,? wildcards allowed]\r\n -C : Continue on error\r\n -Q : Quiet\r\n -R : Recurse subdirectories\r\n" -MSG.DIR .AZ "RM Dir :%S..." -MSG.FILE .AZ "RM File:%S..." +MSG.DIR .AZ "RM Dir :%s..." +MSG.FILE .AZ "RM File:%s..." MSG.OK .AZ "[OK]" MSG.ERR .AZ "[%h]\r\n" MSG.DONE .AZ "%D File(s) Removed.\r\n" diff --git a/INC/LIB.NET.I.txt b/INC/LIB.NET.I.txt index 9f5ee422..5b4484a2 100644 --- a/INC/LIB.NET.I.txt +++ b/INC/LIB.NET.I.txt @@ -12,7 +12,9 @@ LIBNET.PULSE .EQ 10 *-------------------------------------- S.NETCFG.STATUS .EQ 0 S.NETCFG.DevID .EQ 1 -S.NETCFG.MAC .EQ 2 +S.NETCFG.DevFlags .EQ 2 +* +S.NETCFG.MAC .EQ 4 *-------------------------------------- MAN SAVE INC/LIB.NET.I diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 2ddf0041..b74d80b1 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -72,25 +72,27 @@ ERR.ARP.PENDING .EQ $B5 UDP.PORT.DNS .EQ 53 UDP.PORT.PMAP .EQ 111 *-------------------------------------- -S.IPCFG.STATUS .EQ 0 +*S.IPCFG.STATUS .EQ 0 S.IPCFG.STATUS.OFF .EQ %00000000 TCPIP Unconfigured S.IPCFG.STATUS.SDISC .EQ %00000001 DISCOVERY Sent S.IPCFG.STATUS.ROFFER .EQ %00000010 OFFER Received S.IPCFG.STATUS.SREQ .EQ %00000100 REQUEST Sent S.IPCFG.STATUS.RACK .EQ %00001000 ACK Received S.IPCFG.STATUS.OK .EQ %10000000 Fully configured (static or DHCP) -S.IPCFG.DevID .EQ 1 -S.IPCFG.MAC .EQ 2 -S.IPCFG.DHCPSRVR .EQ 8 -S.IPCFG.IP .EQ 12 -S.IPCFG.MASK .EQ 16 -S.IPCFG.GW .EQ 20 -S.IPCFG.DNS1 .EQ 24 -S.IPCFG.DNS2 .EQ 28 -S.IPCFG.HOSTNAME .EQ 32 15+\0 C String -S.IPCFG.DOMAIN .EQ 48 79+\0 C String +*S.IPCFG.DevID .EQ 1 +*S.IPCFG.DevFlags .EQ 2 * -S.IPCFG .EQ 128 +*S.IPCFG.MAC .EQ 4 +S.IPCFG.DHCPSRVR .EQ 10 +S.IPCFG.IP .EQ 14 +S.IPCFG.MASK .EQ 18 +S.IPCFG.GW .EQ 22 +S.IPCFG.DNS1 .EQ 26 +S.IPCFG.DNS2 .EQ 30 +S.IPCFG.HOSTNAME .EQ 34 15+\0 C String +S.IPCFG.DOMAIN .EQ 50 45+\0 C String +* +S.IPCFG .EQ 96 *-------------------------------------- S.ARPCACHE.S .EQ 0 S.ARPCACHE.S.PENDING .EQ 1 diff --git a/INC/NET.DHCP.I.txt b/INC/NET.DHCP.I.txt index 04b5cde5..01c90f95 100644 --- a/INC/NET.DHCP.I.txt +++ b/INC/NET.DHCP.I.txt @@ -41,6 +41,7 @@ S.DHCP.OPTIONS.GW .EQ 3 S.DHCP.OPTIONS.DNS .EQ 6 S.DHCP.OPTIONS.DOMAIN .EQ 15 S.DHCP.OPTIONS.MSGTYPE .EQ 53 +S.DHCP.OPTIONS.SRVID .EQ 54 S.DHCP.OPTIONS.END .EQ 255 * S.DHCP .EQ S.UDP+240 diff --git a/LIB/LIBTCPIP.S.CFG.txt b/LIB/LIBTCPIP.S.CFG.txt index 603cb1d7..911fc80b 100644 --- a/LIB/LIBTCPIP.S.CFG.txt +++ b/LIB/LIBTCPIP.S.CFG.txt @@ -12,63 +12,61 @@ CFG.SET >PULLW ZPTmpPtr1 IPCFG dey bpl .1 -CFG.SET.I >LDYA L.DCB.NIC + ldx #5 + +.2 lda IPCFG+S.NETCFG.MAC,x + sta ARP.REQ.SRCMAC,x + sta ARP.REQ.SHA,x + sta ARP.REP.SRCMAC,x + sta ARP.REP.SHA,x + dex + bpl .2 + + ldx #3 + +.3 lda IPCFG+S.IPCFG.IP,x + sta SA.LOCAL+S.SOCKADDR.ADDR,x + sta ARP.REQ.SPA,x + sta ARP.REP.SPA,x + dex + bpl .3 + + lda IPCFG+S.NETCFG.DevFlags + and #S.DCB.NIC.FLAGS.ARPOFFLOAD + beq .5 + + >LDYA L.DCB.NIC >STYA IOCTL+S.IOCTL.BUFPTR lda #S.IOCTL.STATCODE.GETDCB sta IOCTL+S.IOCTL.STATCODE >PUSHW L.IOCTL >PUSHBI IOCTL.STATUS - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID >SYSCALL IOCTL - bcs * - ldx #5 - -.10 lda DCB.NIC+S.DCB.NIC.MAC,x - sta IPCFG+S.IPCFG.MAC,x - sta ARP.REQ.SRCMAC,x - sta ARP.REQ.SHA,x - sta ARP.REP.SRCMAC,x - sta ARP.REP.SHA,x - dex - bpl .10 + ldx #11 IP/MASK/GW - ldx #3 - -.11 lda IPCFG+S.IPCFG.IP,x - sta SA.LOCAL+S.SOCKADDR.ADDR,x - sta ARP.REQ.SPA,x - sta ARP.REP.SPA,x - dex - bpl .11 - - lda DCB.NIC+S.DCB.NIC.FLAGS - and #S.DCB.NIC.FLAGS.ARPOFFLOAD - beq .2 - - ldx #11 - -.1 lda IPCFG+S.IPCFG.IP,x +.4 lda IPCFG+S.IPCFG.IP,x sta DCB.NIC+S.DCB.NIC.IP,x dex - bpl .1 + bpl .4 lda S.IOCTL.CTRLCODE.SETDCB sta S.IOCTL.CTRLCODE >PUSHW L.IOCTL >PUSHBI IOCTL.CONTROL - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID >SYSCALL IOCTL bcs .9 -.2 lda hDNSSocket - beq .3 +.5 lda hDNSSocket + beq .6 jsr SKT.Shutdown stz hDNSSocket -.3 lda IPCFG+S.IPCFG.DNS1 +.6 lda IPCFG+S.IPCFG.DNS1 beq .8 >PUSHBI 0 no protocol @@ -83,7 +81,7 @@ CFG.SET.I >LDYA L.DCB.NIC >PUSHW L.SA.LOCAL lda hDNSSocket - jsr SKT.Bind + jmp SKT.Bind .8 clc .9 rts diff --git a/LIB/LIBTCPIP.S.FRM.txt b/LIB/LIBTCPIP.S.FRM.txt index 1fb91d2b..7ddcc226 100644 --- a/LIB/LIBTCPIP.S.FRM.txt +++ b/LIB/LIBTCPIP.S.FRM.txt @@ -98,7 +98,7 @@ FRM.NewIP stx .8+1 adc ZPFrameOutPtr+1 sta ZPDataOutPtr+1 - lda DCB.NIC+S.DCB.NIC.FLAGS + lda IPCFG+S.NETCFG.DevFlags and #S.DCB.NIC.FLAGS.IPOFFLOAD bne .7 @@ -158,7 +158,7 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload dex bpl .1 - lda DCB.NIC+S.DCB.NIC.FLAGS + lda IPCFG+S.NETCFG.DevFlags and #S.DCB.NIC.FLAGS.IPOFFLOAD bne .21 @@ -239,7 +239,7 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload bne .5 jsr IP.ComputeICMPChecksum -.5 lda DCB.NIC+S.DCB.NIC.FLAGS +.5 lda IPCFG+S.NETCFG.DevFlags and #S.DCB.NIC.FLAGS.ARPOFFLOAD bne .6 @@ -343,7 +343,7 @@ FRM.Send ldx #3 FRM.Send.IOCTL >PUSHW L.IOCTL >PUSHBI IOCTL.WRITE - lda IPCFG+S.IPCFG.DevID + lda IPCFG+S.NETCFG.DevID >SYSCALL IOCTL rts *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 3ed400ca..927c76f3 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -34,6 +34,7 @@ IPDEBUG .EQ 0 .INB INC/MLI.E.I .INB INC/NIC.I .INB INC/ETH.I + .INB INC/LIB.NET.I .INB INC/LIBTCPIP.I *-------------------------------------- ZPFrameInPtr .EQ ZPLIB diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt deleted file mode 100644 index 6af01de2..00000000 --- a/SBIN/DHCPCLNT.S.txt +++ /dev/null @@ -1,523 +0,0 @@ -NEW -PREFIX -AUTO 4,1 - .LIST OFF - .OP 65C02 - .OR $2000 - .TF SBIN/DHCPCLNT -*-------------------------------------- - .INB INC/MACROS.I - .INB INC/A2OSX.I - .INB INC/ETH.I - .INB INC/LIBTCPIP.I - .INB INC/NET.DHCP.I -*-------------------------------------- -TIMEOUT.MAX .EQ 200 20 sec. -*-------------------------------------- -ZPIPCfgPtr .EQ ZPBIN -ZPFrameBase .EQ ZPBIN+2 -ZPFramePtr .EQ ZPBIN+4 -*-------------------------------------- -* File Header (16 Bytes) -*-------------------------------------- -CS.START cld - jmp (.1,x) - .DA #$61 6502,Level 1 (65c02) - .DA #1 BIN Layout Version 1 - .DA #S.PS.F.EVENT - .DA #0 - .DA CS.END-CS.START CS - .DA DS.END-DS.START DS - .DA #64 SS - .DA #6 ZP - .DA 0 -*-------------------------------------- -* Relocation Table -*-------------------------------------- -.1 .DA CS.INIT - .DA CS.RUN - .DA CS.DOEVENT - .DA CS.QUIT -L.LIBTCPIP .DA LIBTCPIP -L.IPCFG .DA IPCFG -L.SA.LOCAL .DA SA.LOCAL -L.SA.REMOTE .DA SA.REMOTE -L.MSG.CFG1 .DA MSG.CFG1 -L.MSG.CFG2 .DA MSG.CFG2 -L.MSG.CFG.KO .DA MSG.CFG.KO -L.MSG.CFG.OK .DA MSG.CFG.OK -L.MSG.CFG.ND .DA MSG.CFG.ND -L.MSG.CFG.NA .DA MSG.CFG.NA -L.DHCP.DISC .DA DHCP.DISC -L.DHCP.REQ .DA DHCP.REQ - .DA 0 -*-------------------------------------- -CS.INIT >LDYA L.LIBTCPIP - >SYSCALL LoadLib - bcs .9 - sta hLIBTCPIP - - >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG - bcs .9 - - >STYA ZPIPCfgPtr - - lda (ZPIPCfgPtr) - and #S.IPCFG.STATUS.OK - bne .99 Already Configured, exit - - ldy #S.IPCFG.hFD - lda (ZPIPCfgPtr),y - beq .98 - - ldy #S.IPCFG-1 - -.1 lda (ZPIPCfgPtr),y - sta IPCFG,y - dey - bne .1 - - stz IPCFG+S.IPCFG.STATUS - - ldx #3 - -.11 lda A2osX.TIMER16,x - sta DHCP.DISC.XID,x - sta DHCP.REQ.XID,x - dex - bpl .11 - - ldx #5 - -.2 lda IPCFG+S.IPCFG.MAC,x - sta DHCP.DISC.CHADDR,x - sta DHCP.REQ.CHADDR,x - dex - bpl .2 - - clc -.9 rts - -.98 >LDYA L.MSG.CFG.ND - bra .90 -.99 >LDYA L.MSG.CFG.NA - -.90 >SYSCALL puts - lda #0 - sec - rts -*-------------------------------------- -CS.RUN >PUSHBI 0 no protocol - lda #S.SOCKET.T.DGRAM - >LIBCALL hLIBTCPIP,LIBTCPIP.Socket - bcc .1 -.9 jmp CS.RUN.KO - -.1 >STA.G hSocket - pha - >PUSHW L.SA.LOCAL - pla - >LIBCALL hLIBTCPIP,LIBTCPIP.Bind - bcs .9 - - >PUSHWI S.SOCKET.O.BROADCAST - >LDA.G hSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.setsockopt - - >PUSHW L.SA.REMOTE - >LDA.G hSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.Connect - bcs .9 - - >LDYA L.MSG.CFG1 - >SYSCALL puts - - jsr Init.Timeout - -CS.RUN.SDISC >PUSHWI DHCP.DISC.LEN - >PUSHW L.DHCP.DISC - >LDA.G hSocket - - >LIBCALL hLIBTCPIP,LIBTCPIP.Send - bcc .1 - jmp CS.RUN.KO - -.1 lda #S.IPCFG.STATUS.SDISC - sta IPCFG - -CS.RUN.ROFFER >SLEEP - - jsr CS.RUN.SKT.RCVD - bcc .1 - jsr Wait.Timeout - bne CS.RUN.ROFFER - - lda #1 - jmp CS.RUN.KO - -.1 jsr CheckDHCPOffer - - bcs CS.RUN.ROFFER - - lda #S.IPCFG.STATUS.ROFFER - sta IPCFG - -CS.RUN.SREQ ldx #3 - -.1 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x - dex - bpl .1 - - >PUSHBI 4 - >LDYA L.MSG.CFG2 - >SYSCALL printf - - >PUSHWI DHCP.REQ.LEN - >PUSHW L.DHCP.REQ - >LDA.G hSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.Send - bcs CS.RUN.KO - - lda #S.IPCFG.STATUS.SREQ - sta IPCFG - -CS.RUN.RACK >SLEEP - - jsr CS.RUN.SKT.RCVD - bcc .1 - jsr Wait.Timeout - bne CS.RUN.RACK - lda #2 - bra CS.RUN.KO - -.1 jsr CheckDHCPAck - bcs CS.RUN.RACK - -CS.RUN.OK lda #S.IPCFG.STATUS.OK - sta IPCFG - - >PUSHW L.IPCFG - >LIBCALL hLIBTCPIP,LIBTCPIP.SET.IPCFG - - ldx #3 -.1 lda IPCFG+S.IPCFG.MASK,x - >PUSHA - dex - bpl .1 - - ldx #3 -.2 lda IPCFG+S.IPCFG.IP,x - >PUSHA - dex - bpl .2 - - >PUSHBI 8 - >LDYA L.MSG.CFG.OK - >SYSCALL printf - lda #0 Leave with NO ERROR - sec - rts - -CS.RUN.KO pha - >PUSHA - >PUSHBI 1 - >LDYA L.MSG.CFG.KO - >SYSCALL printf - pla - sec - rts -*-------------------------------------- -CS.RUN.SKT.RCVD >LDA.G hSocket - >LIBCALL hLIBTCPIP,LIBTCPIP.Recv - bcs .9 - >STA.G hFrame - - >SYSCALL GetMemPtr - >STYA ZPFrameBase -.9 rts -*-------------------------------------- -CS.DOEVENT lda (pEvent) - bpl .9 is it a TIMER event? - - ldy #TimeOut - lda (pData),y - beq .9 - - dec - sta (pData),y - -.9 sec do not discard TIMER event - rts -*-------------------------------------- -CS.QUIT >LDA.G hSocket - beq .1 - - >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown - -.1 lda hLIBTCPIP - beq .8 - >SYSCALL UnloadLib - -.8 clc - rts -*-------------------------------------- -CheckDHCPOffer jsr CheckDHCPXID - bcs .9 - - lda ZPFrameBase - clc - adc #S.DHCP.OPTIONS - sta ZPFramePtr - - lda ZPFrameBase+1 - adc /S.DHCP.OPTIONS - sta ZPFramePtr+1 - - lda (ZPFramePtr) - cmp #S.DHCP.OPTIONS.MSGTYPE - bne .9 - - ldy #2 - lda (ZPFramePtr),y - cmp #S.DHCP.OPTIONS.DHCPOffer - bne .9 - - ldy #S.DHCP.GIADDR+3 - ldx #3 - -.1 lda (ZPFrameBase),y - sta DHCP.REQ.GIADDR,x - dey - dex - bpl .1 - - ldy #S.DHCP.YIADDR+3 - ldx #3 - -.2 lda (ZPFrameBase),y - sta DHCP.REQ.OPT.REQIP,x - sta IPCFG+S.IPCFG.IP,x - dey - dex - bpl .2 - - ldy #S.IP.SRC+3 - ldx #3 - -.3 lda (ZPFrameBase),y - sta DHCP.REQ.OPT.SVRIP,x - sta IPCFG+S.IPCFG.DHCPSRVR,x - dey - dex - bpl .3 - -.5 inc ZPFramePtr skip Option 53 (DHCPOffer:530102) - bne .6 - inc ZPFramePtr+1 - -.6 lda (ZPFramePtr) - sec - adc ZPFramePtr add option len + 1 - sta ZPFramePtr - bcc .7 - inc ZPFramePtr+1 - -.7 lda (ZPFramePtr) - cmp #S.DHCP.OPTIONS.END - beq .8 - jsr GetDHCPOption - bra .5 - -.8 jsr CS.RUN.DISCARD - clc - rts - -.9 jsr CS.RUN.DISCARD - sec - rts -*-------------------------------------- -CS.RUN.DISCARD >LDA.G hFrame - >SYSCALL FreeMem - rts -*-------------------------------------- -GetDHCPOption cmp #S.DHCP.OPTIONS.MASK - bne .1 - ldx #S.IPCFG.MASK - bra GetDHCPOption.CopyIP - -.1 cmp #S.DHCP.OPTIONS.GW - bne .2 - - ldx #S.IPCFG.GW - bra GetDHCPOption.CopyIP - -.2 cmp #S.DHCP.OPTIONS.DNS - bne .3 - - ldx #S.IPCFG.DNS1 - bra GetDHCPOption.CopyIP - -.3 cmp #S.DHCP.OPTIONS.DOMAIN - bne .9 - - ldy #1 - - lda (ZPFramePtr),y Get String len - cmp #80 - bcc .4 - lda #79 - -.4 sta IPCFG+S.IPCFG.DOMAIN store len - tax - -.5 iny - lda (ZPFramePtr),y - sta IPCFG+S.IPCFG.DOMAIN-1,y - dex - bne .5 - -.9 rts -*-------------------------------------- -GetDHCPOption.CopyIP - ldy #1 - lda (ZPFramePtr),y Get Byte count - cmp #9 - bcc .1 - lda #8 max 8 bytes (2 DNS) - -.1 iny - -.2 pha - - lda (ZPFramePtr),y - sta IPCFG,x - iny - inx - - pla - dec - bne .2 - - rts -*-------------------------------------- -CheckDHCPAck jsr CheckDHCPXID - bcs .9 - - lda ZPFrameBase - clc - adc #S.DHCP.OPTIONS - sta ZPFramePtr - - lda ZPFrameBase+1 - adc /S.DHCP.OPTIONS - sta ZPFramePtr+1 - - lda (ZPFramePtr) - cmp #S.DHCP.OPTIONS.MSGTYPE - bne .9 - - ldy #2 - lda (ZPFramePtr),y - cmp #S.DHCP.OPTIONS.DHCPAck - bne .9 - - jsr CS.RUN.DISCARD - clc - rts - -.9 jsr CS.RUN.DISCARD - sec - rts -*-------------------------------------- -CheckDHCPXID ldy #S.DHCP.XID+3 - ldx #3 - -.1 lda (ZPFrameBase),y - cmp DHCP.DISC.XID,x same XID ? - bne .9 - dey - dex - bpl .1 - - clc - rts - -.9 sec - rts -*-------------------------------------- -Init.Timeout ldy #TimeOut - lda #TIMEOUT.MAX - sta (pData),y - rts -*-------------------------------------- -Wait.TimeOut ldy #TimeOut - lda (pData),y - rts -*-------------------------------------- -CS.END -LIBTCPIP .AZ "libtcpip" -MSG.CFG1 .AZ "DHCPCLNT:Searching for DHCP servers..." -MSG.CFG2 .AZ "DHCPCLNT:Reply from DHCP Server at %d.%d.%d.%d, requesting...\r\n" -MSG.CFG.KO .AZ "DHCPCLNT:Time Out [%h].\r\n" -MSG.CFG.OK .AZ "DHCPCLNT:Success:[IP=%d.%d.%d.%d/%d.%d.%d.%d]\r\n" -MSG.CFG.ND .AZ "DHCPCLNT:No Device, exiting." -MSG.CFG.NA .AZ "DHCPCLNT:TCPIP Already configured, exiting." -hLIBTCPIP .BS 1 -IPCFG .BS S.IPCFG -*-------------------------------------- -SA.LOCAL .DA #AF.INET S.SOCKADDR.AF - .BS 1 - .HS 00.00.00.00 S.SOCKADDR.ADDR - .DA UDP.PORT.DHCPC S.SOCKADDR.PORT -*-------------------------------------- -SA.REMOTE .DA #AF.INET S.SOCKADDR.AF - .BS 1 - .HS FF.FF.FF.FF S.SOCKADDR.ADDR - .DA UDP.PORT.DHCPS S.SOCKADDR.PORT -*-------------------------------------- -DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS -DHCP.DISC.XID .BS 4 - .HS 0000 SECS - .DA S.DHCP.FLAGS.BRDCST - .HS 00000000 CIADDR -DHCP.DISC.YIADDR .HS 00000000 - .HS 00000000 SIADDR -DHCP.DISC.GIADDR .HS 00000000 -DHCP.DISC.CHADDR .HS 00000000.00000000.00000000.00000000 - .BS 64 SNAME - .BS 128 FILE - .HS 63825363 COOKIE - .HS 3501 OPT - .DA #S.DHCP.OPTIONS.DHCPDiscover - .HS 37040103060FFF -DHCP.DISC.LEN .EQ *-DHCP.DISC -*-------------------------------------- -DHCP.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS -DHCP.REQ.XID .BS 4 - .HS 0000 SECS - .DA S.DHCP.FLAGS.BRDCST - .HS 00000000 CIADDR -DHCP.REQ.YIADDR .HS 00000000 - .HS 00000000 SIADDR -DHCP.REQ.GIADDR .HS 00000000 -DHCP.REQ.CHADDR .HS 00000000.00000000.00000000.00000000 - .BS 64 SNAME - .BS 128 FILE - .HS 63825363 COOKIE - .HS 3501 OPT - .DA #S.DHCP.OPTIONS.DHCPRequest - .HS 3204 -DHCP.REQ.OPT.REQIP .BS 4 - .HS 3604 -DHCP.REQ.OPT.SVRIP .BS 4 - .HS FF -DHCP.REQ.LEN .EQ *-DHCP.REQ -*-------------------------------------- -DS.START -TimeOut .BS 1 -hSocket .BS 1 -hFrame .BS 1 -DS.END -MAN -SAVE USR/SRC/SBIN/DHCPCLNT.S -ASM diff --git a/SBIN/NETWORKD.S.txt b/SBIN/NETWORKD.S.txt index 57179fc1..26ef0fbb 100644 --- a/SBIN/NETWORKD.S.txt +++ b/SBIN/NETWORKD.S.txt @@ -130,6 +130,10 @@ CS.INIT.LIBS lda LibCnt ldy #S.NETCFG.DevID sta (pNETCFG),y + iny S.NETCFG.DevFlags + lda DCB.NIC+S.DCB.NIC.FLAGS + sta (pNETCFG),y + ldx #5 ldy #S.NETCFG.MAC+5 diff --git a/SBIN/TCPIPD.S.txt b/SBIN/TCPIPD.S.txt deleted file mode 100644 index 81f2bf3f..00000000 --- a/SBIN/TCPIPD.S.txt +++ /dev/null @@ -1,74 +0,0 @@ -NEW -PREFIX -AUTO 4,1 - .LIST OFF - .OP 65C02 - .OR $2000 - .TF SBIN/TCPIPD -*-------------------------------------- - .INB INC/MACROS.I - .INB INC/A2OSX.I - .INB INC/ETH.I - .INB INC/LIBTCPIP.I -*-------------------------------------- -* File Header (16 Bytes) -*-------------------------------------- -CS.START cld - jmp (.1,x) - .DA #$61 6502,Level 1 (65c02) - .DA #1 BIN Layout Version 1 - .DA #S.PS.F.EVENT - .DA #0 - .DA CS.END-CS.START CS - .DA DS.END-DS.START DS - .DA #64 SS - .DA #0 ZP - .DA 0 -*-------------------------------------- -* Relocation Table -*-------------------------------------- -.1 .DA CS.INIT - .DA CS.RUN - .DA CS.DOEVENT - .DA CS.QUIT -L.LIBTCPIP .DA LIBTCPIP - .DA 0 -*-------------------------------------- -CS.INIT >LDYA L.LIBTCPIP - >SYSCALL LoadLib - bcs .9 - sta hLIBTCPIP - -.9 rts -*-------------------------------------- -CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.POLL - clc - rts -*-------------------------------------- -CS.DOEVENT lda (pEvent) - bpl .9 - >LIBCALL hLIBTCPIP,LIBTCPIP.PULSE - -.9 sec never discard TIME event - rts -*-------------------------------------- -CS.QUIT lda hLIBTCPIP - beq .8 - - >SYSCALL UnloadLib -.8 clc - rts -*-------------------------------------- -CS.END -*-------------------------------------- -LIBTCPIP .AZ "libtcpip" -hLIBTCPIP .BS 1 -*-------------------------------------- - .DUMMY - .OR 0 -DS.START -DS.END .ED -*-------------------------------------- -MAN -SAVE USR/SRC/SBIN/TCPIPD.S -ASM