From dc285bcbc08dc5ed419c131feeed06e232eb24a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 26 Jul 2018 17:26:39 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes ETC/TCPIP.CONF | 12 +- INC/A2osX.I.txt | 2 +- LIB/LIBTCPIP.S.CFG.txt | 462 ++++++++++++++++++++++++++++++++++++--- LIB/LIBTCPIP.S.txt | 87 ++++++-- SBIN/TCPIPD.S.CFG.txt | 381 -------------------------------- SBIN/TCPIPD.S.txt | 95 +------- SYS/KERNEL.S.STDIO.txt | 64 ++++-- 9 files changed, 562 insertions(+), 541 deletions(-) delete mode 100644 SBIN/TCPIPD.S.CFG.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index e7c995218e63a357cfbb1891601c4e0b2ea276c5..b638fc2e320656ac6d9498a49a62fecb9356c3f4 100644 GIT binary patch delta 8694 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 XZ}Tp1^C@rhEpPKHZ}V?x3po0JgUSEe delta 8521 zcmai33tSUd)}P!-cq#;+L5p4>!$Se74@}5du_^?`w<7YK`q+hT(bhh;&n0c8wR{W< z`mG~v;*MFv8q3f``_;7-YahQhXln;SpbBWKBD#vvYU|oZzH=v7ZFl=y@|(GHU*~bp zx##@v#bTLku}pS_Yt*;&k>Oj1Yhu;^(yK>oO;Ko8SWw)?0TV$!sv9TU>~ zI^LYAV&W7MbCl`i6);hyp^5{jxv^2B28SBL_N7Y!D(zY`5SXA41_B_-;-Ii|LjLV1Kez)g9FdwRH5 zujYvMmSs!x?_2SRw%RK0`P9~DTi3U4Y5iO4q1K0wKXP0={+Hvmtvg!}w!V3M-|
UUvD$wkG_ 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 VfF}^1Ab5h|3E3a;S?KM3{}05rfVltw diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 39adefc8e7b4c1c4c615352a7cbe1ce52b83f55a..62ced5a49b13d1c718e0763ffe0851a1e23ba0a9 100644 GIT binary patch delta 24489 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�$e*HbHy^|KR#gX4^I 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 ZPTmpPtr1 IPCFG +CFG.Init >LDYA L.DEVNAME + >SYSCALL GetDevByName + bcc .1 + inc DEVNAME+3 + lda DEVNAME+3 + cmp #'8' + bne CFG.Init + >LDYA L.MSG.DEV.KO + >SYSCALL printf + + lda #MLI.E.NODEV +.9 sec + rts + +.1 stx IPCFG+S.IPCFG.HDEV + + >PUSHW L.DEVNAME + >LDYA L.MSG.DEV.OK + >SYSCALL printf + + >PUSHWI 0 + >PUSHBI IOCTL.OPEN + lda IPCFG+S.IPCFG.HDEV + >SYSCALL IOCTL + bcs .9 + >LDYA L.DCB.NIC >STYA IOCTL+S.IOCTL.BUFPTR lda #S.IOCTL.STATCODE.GETDCB sta IOCTL+S.IOCTL.STATCODE - ldx #IOCTL.STATUS - jsr SET.IPCFG.IOCTL - - ldy #0 - -.1 lda (ZPTmpPtr1),y - sta IPCFG,y - iny - cpy #S.IPCFG - bne .1 + >PUSHW L.IOCTL + >PUSHBI IOCTL.STATUS + lda IPCFG+S.IPCFG.HDEV + >SYSCALL IOCTL + bcs .9 ldx #5 @@ -43,34 +63,421 @@ SET.IPCFG >PULLW ZPTmpPtr1 IPCFG dex bpl .3 - lda DCB.NIC+S.DCB.NIC.FLAGS - and #S.DCB.NIC.FLAGS.ARPOFFLOAD +CFG.EtcFiles >LDYA L.MSG.CFG + >SYSCALL printf + + jsr CFG.Read.HOSTNAME + jsr CFG.Read.Result + + lda IPCFG+S.IPCFG.HOSTNAME + bne .4 + + ldy #$ff + +.2 iny + lda DefaultHostName,y + sta IPCFG+S.IPCFG.HOSTNAME,y + bne .2 + +.3 lda A2osX.TIMER16 + jsr CFG.A2CharAX + sta IPCFG+S.IPCFG.HOSTNAME+6 + stx IPCFG+S.IPCFG.HOSTNAME+7 + + lda A2osX.TIMER16+1 + jsr CFG.A2CharAX + sta IPCFG+S.IPCFG.HOSTNAME+8 + stx IPCFG+S.IPCFG.HOSTNAME+9 + +.4 >PUSHW L.TCPIP.CONF + >LDYA L.MSG.CFG + >SYSCALL printf + + jsr CFG.Read.TCPIP.CONF + jsr CFG.Read.Result + + >PUSHW L.HOSTS + >LDYA L.MSG.CFG + >SYSCALL printf + + jsr CFG.Read.HOSTS + jsr CFG.Read.Result + + jmp SET.IPCFG.I +*-------------------------------------- +CFG.Read.Result bcc .1 + >PUSHA + >LDYA L.MSG.CFG.KO + bra .2 +.1 >LDYA L.MSG.CFG.OK +.2 >SYSCALL printf + rts +*-------------------------------------- +CFG.Read.HOSTNAME + >LDYA L.HOSTNAME + jsr CFG.Read.LoadFile + bcs .9 + +* read 15 chars MAX, until CR or EOF + + ldx #$15 + lda CFG.FileLen+1 + bne .1 File is more than 256....? + + ldx CFG.FileLen + beq .9 len is 0 !!! + +.1 ldy #0 + +.2 lda (ZPTmpPtr1),y + cmp #13 + beq .8 A CR, end of name + + sta IPCFG+S.IPCFG.HOSTNAME,y + iny + dex + bne .2 + +.8 lda #0 + sta IPCFG+S.IPCFG.HOSTNAME,y + + jsr CFG.Read.CleanUp + clc + rts + +.9 jsr CFG.Read.CleanUp + sec + rts +*-------------------------------------- +CFG.Read.TCPIP.CONF + >LDYA L.TCPIP.CONF + jsr CFG.Read.LoadFile + bcs .9 + +.1 jsr CFG.GetLine + bcs .8 + + jsr CFG.GetKeyword + bcs .1 + + lda CFG.Keyword + bne .3 + + ldy UsrBuf256 + + lda UsrBuf256+1,y + cmp #35 DOMAIN too long!!! + bcs .1 + + sta IPCFG+S.IPCFG.DOMAIN + ldx #0 + +.2 lda UsrBuf256+2,y + sta IPCFG+S.IPCFG.DOMAIN,x + beq .1 + inx + iny + bne .2 + bra .1 + +.9 jsr CFG.Read.CleanUp + sec + rts + +.3 jsr CFG.ScanIP + bcs .1 + + ldy CFG.Keyword + lda CFG.Keyword.Map,y + tax + ldy #0 + +.4 lda CFG.IP+1,y + sta IPCFG,x + inx + iny + cpy #4 + bne .4 + lda CFG.Keyword + cmp #1 + bne .1 + lda #S.IPCFG.STATUS.OK + sta IPCFG + bra .1 + +.8 jsr CFG.Read.CleanUp + clc + rts +*-------------------------------------- +CFG.Read.HOSTS >LDYA L.HOSTS + + jsr CFG.Read.LoadFile + bcs .9 + + +.8 jsr CFG.Read.CleanUp + clc + rts + +.9 jsr CFG.Read.CleanUp + sec + rts +*-------------------------------------- +CFG.Read.LoadFile + stz CFG.hCfgFile + stz CFG.hCfgPath + + >SYSCALL ExpandStr + bcs .9 + + stx CFG.hCfgPath + pha + + >PUSHWI 0 Aux type + >PUSHBI 4 S.FI.T.TXT + >PUSHBI SYS.FOpen.R + pla + >SYSCALL LoadFile + bcs .9 + + stx CFG.hCfgFile + >STYA CFG.FileLen + txa + >SYSCALL GetMemPtr + >STYA ZPTmpPtr1 +.9 rts +*-------------------------------------- +CFG.Read.CleanUp + pha + lda CFG.hCfgPath + beq .1 + >SYSCALL FreeMem + +.1 lda CFG.hCfgFile + beq .8 + >SYSCALL FreeMem + +.8 pla + rts +*-------------------------------------- +CFG.GetLine stz UsrBuf256 + ldx #0 + ldy #0 + +.1 jsr CFG.GetChar + bne .2 end of file? + txa + bne .8 + sec + rts + +.2 cmp #$0D + beq .8 end of line + inx + sta UsrBuf256,x + cmp #'=' + bne .3 + txa + dec + tay +.3 cpx #64 line too long ? + bne .1 + sec + rts + +.8 tya = found ? + beq .9 + + sta UsrBuf256 + txa + sec + sbc UsrBuf256 + sta UsrBuf256+1,y + stz UsrBuf256+1,x End with 0 for ScanIP + clc + rts + +.9 sec + rts +*-------------------------------------- +CFG.GetChar lda CFG.FileLen + bne .1 + lda CFG.FileLen+1 + beq .9 + dec CFG.FileLen+1 +.1 dec CFG.FileLen + lda (ZPTmpPtr1) + inc ZPTmpPtr1 + bne .9 + inc ZPTmpPtr1+1 NZ +.9 rts +*-------------------------------------- +CFG.GetKeyword stz CFG.Keyword + + ldx #0 + +.1 phx + ldy #0 + +.2 lda CFG.Keywords,x + cmp UsrBuf256,y + bne .3 + cpy UsrBuf256 beq .4 + inx + iny + bne .2 + plx + sec + rts + +.3 inc CFG.Keyword + plx + txa + sec + adc CFG.Keywords,x + tax + lda CFG.Keywords,x + bne .1 + sec + rts + +.4 plx + clc + rts +*-------------------------------------- +CFG.ScanIP stz CFG.IP + + ldx UsrBuf256 + +.1 ldy #0 +.11 lda UsrBuf256+2,x + beq .3 + cmp #'0' + bcc .2 + cmp #'9'+1 + bcs .2 + cpy #3 + beq .9 + iny + sta CFG.StrBuf,y + inx + bra .11 + +.2 cmp #'.' + bne .9 + +.3 sty CFG.StrBuf + lda CFG.IP + cmp #4 + beq .9 + jsr CFG.Dec2Hex + bcs .9 + lda CFG.HexByte + inc CFG.IP + ldy CFG.IP + sta CFG.IP,y + inx + lda UsrBuf256+1,x + bne .1 + clc + rts + +.9 sec + rts +*-------------------------------------- +CFG.Dec2Hex sec + ldy CFG.StrBuf + beq .9 + + lda CFG.StrBuf+1 + and #$0f + sta CFG.HexByte + + ldy #1 + +.1 cpy CFG.StrBuf + beq .8 + iny + lda CFG.HexByte + asl CFG.HexByte + bcs .9 + asl CFG.HexByte + bcs .9 + adc CFG.HexByte + bcs .9 + asl + bcs .9 + sta CFG.HexByte + lda CFG.StrBuf,y + and #$0f + adc CFG.HexByte + sta CFG.HexByte + bcc .1 +.9 rts + +.8 clc + rts +*-------------------------------------- +CFG.A2CharAX pha + lsr + lsr + lsr + lsr + ora #$30 + cmp #'9'+1 + bcc .1 + adc #6 +.1 tax + pla + and #$0F + ora #$30 + cmp #'9'+1 + bcc .8 + adc #6 +.8 rts +*-------------------------------------- +SET.IPCFG >PULLW ZPTmpPtr1 IPCFG + + ldy #0 + +.1 lda (ZPTmpPtr1),y + sta IPCFG,y + iny + cpy #S.IPCFG + bne .1 + +SET.IPCFG.I lda DCB.NIC+S.DCB.NIC.FLAGS + and #S.DCB.NIC.FLAGS.ARPOFFLOAD + beq .2 ldx #11 -.31 lda IPCFG+S.IPCFG.IP,x +.1 lda IPCFG+S.IPCFG.IP,x sta DCB.NIC+S.DCB.NIC.IP,x dex - bpl .31 + bpl .1 -* lda S.IOCTL.CTRLCODE.SETDCB same as lda S.IOCTL.STATCODE.GETDCB -* sta S.IOCTL.CTRLCODE same as sta S.IOCTL.STATCODE + lda S.IOCTL.CTRLCODE.SETDCB + sta S.IOCTL.CTRLCODE - ldx #IOCTL.CONTROL - jsr SET.IPCFG.IOCTL + >PUSHW L.IOCTL + >PUSHBI IOCTL.CONTROL + lda IPCFG+S.IPCFG.HDEV + >SYSCALL IOCTL + bcs .9 -.4 lda hDNSSocket1 - beq .41 +.2 lda hDNSSocket1 + beq .3 jsr SKT.Close stz hDNSSocket1 -.41 lda hDNSSocket2 - beq .42 +.3 lda hDNSSocket2 + beq .4 jsr SKT.Close stz hDNSSocket2 -.42 lda IPCFG+S.IPCFG.DNS1 +.4 lda IPCFG+S.IPCFG.DNS1 beq .6 ldx #3 @@ -110,13 +517,6 @@ SET.IPCFG >PULLW ZPTmpPtr1 IPCFG .8 clc .9 rts - -SET.IPCFG.IOCTL >PUSHW L.IOCTL - txa - >PUSHA - lda IPCFG+S.IPCFG.HDEV - >SYSCALL IOCTL - rts *-------------------------------------- * grab a copy on the fly for lib function * OUT : diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 391e46c8..1475e07b 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -83,6 +83,15 @@ CS.START cld .DA SKT.Read .DA SKT.ReadFrame *-------------------------------------- +L.DEVNAME .DA DEVNAME +L.MSG.DEV.KO .DA MSG.DEV.KO +L.MSG.DEV.OK .DA MSG.DEV.OK +L.MSG.CFG .DA MSG.CFG +L.MSG.CFG.KO .DA MSG.CFG.KO +L.MSG.CFG.OK .DA MSG.CFG.OK +L.HOSTNAME .DA HOSTNAME +L.TCPIP.CONF .DA TCPIP.CONF +L.HOSTS .DA HOSTS L.IPCFG .DA IPCFG L.ARP.REQ .DA ARP.REQ L.ARP.REP .DA ARP.REP @@ -110,9 +119,14 @@ L.TCP.IN.JMP .DA TCP.IN.JMP.CLOSED *-------------------------------------- LIB.LOAD ldx RefCount bne .8 - + sta FD.SSOCK+S.FD.HANDLER + + jsr CFG.Init + bcs .9 + jsr ARP.CLEAR + jsr DNS.CLEAR >LDYAI K.SKTTABLE.SIZE*S.SOCKET @@ -122,13 +136,22 @@ LIB.LOAD ldx RefCount stx hSocketTable .8 inc RefCount + clc .9 rts *-------------------------------------- LIB.UNLOAD dec RefCount bne LIB.UNLOAD.8 - lda hSocketTable + lda IPCFG+S.IPCFG.HDEV + beq .1 + + >PUSHWI 0 + >PUSHBI IOCTL.CLOSE + lda IPCFG+S.IPCFG.HDEV + >SYSCALL IOCTL + +.1 lda hSocketTable beq LIB.UNLOAD.8 >SYSCALL FreeMem @@ -224,6 +247,53 @@ GetDynPort inc DYNPORT.LAST *-------------------------------------- CS.END *-------------------------------------- +DEVNAME .AZ "ETH1" +MSG.DEV.KO .AZ "TCPIPD:No Device Found, exiting.\r\n" +MSG.DEV.OK .AZ "TCPIPD:Bound To Device : %s\r\n" +MSG.CFG .AZ "TCPIPD:Reading %s..." +MSG.CFG.KO .AZ "Failed!!! [%h]\r\n" +MSG.CFG.OK .AZ "OK.\r\n" +*-------------------------------------- +HOSTNAME .AZ "${A2OSX}ETC/HOSTNAME" +TCPIP.CONF .AZ "${A2OSX}ETC/TCPIP.CONF" +HOSTS .AZ "${A2OSX}ETC/HOSTS" +DefaultHostName .AZ "a2osx-XXXX" +CFG.Keywords >PSTR "DOMAIN" + >PSTR "IP" + >PSTR "MASK" + >PSTR "GW" + >PSTR "DNS1" + >PSTR "DNS2" +CFG.Keyword.Map .DA #0 End Of Keyword table and NA Keyword + .DA #S.IPCFG.IP + .DA #S.IPCFG.MASK + .DA #S.IPCFG.GW + .DA #S.IPCFG.DNS1 + .DA #S.IPCFG.DNS2 +CFG.hCfgFile .BS 1 +CFG.hCfgPath .BS 1 +CFG.FileLen .BS 2 +CFG.Keyword .BS 1 +CFG.StrBuf .BS 4 +CFG.HexByte .BS 1 +CFG.IP .BS 5 +UsrBuf256 .BS 256 +*-------------------------------------- +FD.SSOCK .BS 1 S.FD.HANDLER + .DA #S.FD.T.SSOCK + .BS 1 S.FD.SSOCK.HSKT + .DA #0 S.FD.SSOCK.OPEN + .DA #0 S.FD.SSOCK.CLOSE + .DA #0 + .DA #0 + .DA #0 S.FD.SSOCK.STATUS +*-------------------------------------- +IOCTL .BS S.IOCTL +DCB.NIC .BS S.DCB.NIC +IPCFG .BS S.IPCFG +ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE +DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE +*-------------------------------------- ARP.REQ .DA S.ARP Frame size ARP.REQ.DSTMAC .HS FFFFFFFFFFFF ARP.REQ.SRCMAC .BS 6 @@ -266,9 +336,6 @@ DNS.MSG.ID .BS 2 .BS 6 ANCOUNT,NSCOUNT,ARCOUNT DNS.MSG.NAME .BS K.DNS.MAXLEN+6 *-------------------------------------- -IPCFG .BS S.IPCFG -ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE -DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE FRM.QUEUE.Tail .BS 1 FRM.QUEUE.Head .BS 1 FRM.QUEUE.hMem .BS K.FRMQUEUE.SIZE @@ -296,16 +363,6 @@ bTextMode .BS 1 HST.SScanF .AZ "%d.%d.%d.%d" IP.ID .BS 2 IP.CHECKSUM .BS 4 -FD.SSOCK .BS 1 S.FD.HANDLER - .DA #S.FD.T.SSOCK - .BS 1 S.FD.SSOCK.HSKT - .DA #0 S.FD.SSOCK.OPEN - .DA #0 S.FD.SSOCK.CLOSE - .DA #0 - .DA #0 - .DA #0 S.FD.SSOCK.STATUS -IOCTL .BS S.IOCTL -DCB.NIC .BS S.DCB.NIC *-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBTCPIP.S diff --git a/SBIN/TCPIPD.S.CFG.txt b/SBIN/TCPIPD.S.CFG.txt deleted file mode 100644 index 1c58d892..00000000 --- a/SBIN/TCPIPD.S.CFG.txt +++ /dev/null @@ -1,381 +0,0 @@ -NEW -PREFIX /A2OSX.BUILD -AUTO 4,1 - .LIST OFF -*-------------------------------------- -CFG.Read >PUSHW L.HOSTNAME - >LDYA L.MSG.CFG - >SYSCALL printf - - jsr CFG.Read.HOSTNAME - jsr CFG.Read.Result - - lda IPCFG+S.IPCFG.HOSTNAME - bne .4 - - ldy #$ff - -.2 iny - lda DefaultHostName,y - sta IPCFG+S.IPCFG.HOSTNAME,y - bne .2 - -.3 lda A2osX.TIMER16 - jsr CFG.A2CharAX - sta IPCFG+S.IPCFG.HOSTNAME+6 - stx IPCFG+S.IPCFG.HOSTNAME+7 - - lda A2osX.TIMER16+1 - jsr CFG.A2CharAX - sta IPCFG+S.IPCFG.HOSTNAME+8 - stx IPCFG+S.IPCFG.HOSTNAME+9 - -.4 >PUSHW L.TCPIP.CONF - >LDYA L.MSG.CFG - >SYSCALL printf - - jsr CFG.Read.TCPIP.CONF - jsr CFG.Read.Result - - >PUSHW L.HOSTS - >LDYA L.MSG.CFG - >SYSCALL printf - - jsr CFG.Read.HOSTS -*-------------------------------------- -CFG.Read.Result bcc .1 - >PUSHA - >LDYA L.MSG.CFG.KO - bra .2 -.1 >LDYA L.MSG.CFG.OK -.2 >SYSCALL printf - rts -*-------------------------------------- -CFG.Read.HOSTNAME - >LDYA L.HOSTNAME - jsr CFG.Read.LoadFile - bcs .9 - -* read 15 chars MAX, until CR or EOF - - ldx #$15 - lda CFG.FileLen+1 - bne .1 File is more than 256....? - - ldx CFG.FileLen - beq .9 len is 0 !!! - -.1 ldy #0 - -.2 lda (ZPIPCfgPtr),y - cmp #13 - beq .8 A CR, end of name - - sta IPCFG+S.IPCFG.HOSTNAME,y - iny - dex - bne .2 - -.8 lda #0 - sta IPCFG+S.IPCFG.HOSTNAME,y - - jsr CFG.Read.CleanUp - clc - rts - -.9 jsr CFG.Read.CleanUp - sec - rts -*-------------------------------------- -CFG.Read.TCPIP.CONF - >LDYA L.TCPIP.CONF - jsr CFG.Read.LoadFile - bcs .9 - -.1 jsr CFG.GetLine - bcs .8 - - jsr CFG.GetKeyword - bcs .1 - - lda CFG.Keyword - bne .3 - - ldy UsrBuf256 - - lda UsrBuf256+1,y - cmp #35 DOMAIN too long!!! - bcs .1 - - sta IPCFG+S.IPCFG.DOMAIN - ldx #0 - -.2 lda UsrBuf256+2,y - sta IPCFG+S.IPCFG.DOMAIN,x - beq .1 - inx - iny - bne .2 - bra .1 - -.9 jsr CFG.Read.CleanUp - sec - rts - -.3 jsr CFG.ScanIP - bcs .1 - - ldy CFG.Keyword - lda CFG.Keyword.Map,y - tax - ldy #0 - -.4 lda CFG.IP+1,y - sta IPCFG,x - inx - iny - cpy #4 - bne .4 - lda CFG.Keyword - cmp #1 - bne .1 - lda #S.IPCFG.STATUS.OK - sta IPCFG - bra .1 - -.8 jsr CFG.Read.CleanUp - clc - rts -*-------------------------------------- -CFG.Read.HOSTS >LDYA L.HOSTS - - jsr CFG.Read.LoadFile - bcs .9 - - -.8 jsr CFG.Read.CleanUp - clc - rts - -.9 jsr CFG.Read.CleanUp - sec - rts -*-------------------------------------- -CFG.Read.LoadFile - stz CFG.hCfgFile - stz CFG.hCfgPath - - >SYSCALL ExpandStr - bcs .9 - - stx CFG.hCfgPath - pha - - >PUSHWI 0 Aux type - >PUSHBI 4 S.FI.T.TXT - >PUSHBI SYS.FOpen.R - pla - >SYSCALL LoadFile - bcs .9 - - stx CFG.hCfgFile - >STYA CFG.FileLen - txa - >SYSCALL GetMemPtr - >STYA ZPIPCfgPtr -.9 rts -*-------------------------------------- -CFG.Read.CleanUp - pha - lda CFG.hCfgPath - beq .1 - >SYSCALL FreeMem - -.1 lda CFG.hCfgFile - beq .8 - >SYSCALL FreeMem - -.8 pla - rts -*-------------------------------------- -CFG.GetLine stz UsrBuf256 - ldx #0 - ldy #0 - -.1 jsr CFG.GetChar - bne .2 end of file? - txa - bne .8 - sec - rts - -.2 cmp #$0D - beq .8 end of line - inx - sta UsrBuf256,x - cmp #'=' - bne .3 - txa - dec - tay -.3 cpx #64 line too long ? - bne .1 - sec - rts - -.8 tya = found ? - beq .9 - - sta UsrBuf256 - txa - sec - sbc UsrBuf256 - sta UsrBuf256+1,y - stz UsrBuf256+1,x End with 0 for ScanIP - clc - rts - -.9 sec - rts -*-------------------------------------- -CFG.GetChar lda CFG.FileLen - bne .1 - lda CFG.FileLen+1 - beq .9 - dec CFG.FileLen+1 -.1 dec CFG.FileLen - lda (ZPIPCfgPtr) - inc ZPIPCfgPtr - bne .9 - inc ZPIPCfgPtr+1 NZ -.9 rts -*-------------------------------------- -CFG.GetKeyword stz CFG.Keyword - - ldx #0 - -.1 phx - ldy #0 - -.2 lda CFG.Keywords,x - cmp UsrBuf256,y - bne .3 - cpy UsrBuf256 - beq .4 - inx - iny - bne .2 - plx - sec - rts - -.3 inc CFG.Keyword - plx - txa - sec - adc CFG.Keywords,x - tax - lda CFG.Keywords,x - bne .1 - sec - rts - -.4 plx - clc - rts -*-------------------------------------- -CFG.ScanIP stz CFG.IP - - ldx UsrBuf256 - -.1 ldy #0 -.11 lda UsrBuf256+2,x - beq .3 - cmp #'0' - bcc .2 - cmp #'9'+1 - bcs .2 - cpy #3 - beq .9 - iny - sta CFG.StrBuf,y - inx - bra .11 - -.2 cmp #'.' - bne .9 - -.3 sty CFG.StrBuf - lda CFG.IP - cmp #4 - beq .9 - jsr CFG.Dec2Hex - bcs .9 - lda CFG.HexByte - inc CFG.IP - ldy CFG.IP - sta CFG.IP,y - inx - lda UsrBuf256+1,x - bne .1 - clc - rts - -.9 sec - rts -*-------------------------------------- -CFG.Dec2Hex sec - ldy CFG.StrBuf - beq .9 - - lda CFG.StrBuf+1 - and #$0f - sta CFG.HexByte - - ldy #1 - -.1 cpy CFG.StrBuf - beq .8 - iny - lda CFG.HexByte - asl CFG.HexByte - bcs .9 - asl CFG.HexByte - bcs .9 - adc CFG.HexByte - bcs .9 - asl - bcs .9 - sta CFG.HexByte - lda CFG.StrBuf,y - and #$0f - adc CFG.HexByte - sta CFG.HexByte - bcc .1 -.9 rts - -.8 clc - rts -*-------------------------------------- -CFG.A2CharAX pha - lsr - lsr - lsr - lsr - ora #$30 - cmp #'9'+1 - bcc .1 - adc #6 -.1 tax - pla - and #$0F - ora #$30 - cmp #'9'+1 - bcc .8 - adc #6 -.8 rts -*-------------------------------------- -MAN -SAVE /A2OSX.SRC/SBIN/TCPIPD.S.CFG -LOAD /A2OSX.SRC/SBIN/TCPIPD.S -ASM diff --git a/SBIN/TCPIPD.S.txt b/SBIN/TCPIPD.S.txt index f2dc0831..ef898880 100644 --- a/SBIN/TCPIPD.S.txt +++ b/SBIN/TCPIPD.S.txt @@ -35,16 +35,6 @@ CS.START cld .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP -L.DEVNAME .DA DEVNAME -L.MSG.DEV.KO .DA MSG.DEV.KO -L.MSG.DEV.OK .DA MSG.DEV.OK -L.MSG.CFG .DA MSG.CFG -L.MSG.CFG.KO .DA MSG.CFG.KO -L.MSG.CFG.OK .DA MSG.CFG.OK -L.HOSTNAME .DA HOSTNAME -L.TCPIP.CONF .DA TCPIP.CONF -L.HOSTS .DA HOSTS -L.IPCFG .DA IPCFG .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP @@ -52,14 +42,6 @@ CS.INIT >LDYA L.LIBTCPIP bcs .99 sta hLIBTCPIP - jsr CS.INIT.DEV - bcs .99 - - jsr CFG.Read continue even if error opening CFG file - - >PUSHW L.IPCFG - >LIBCALL hLIBTCPIP,LIBTCPIP.SET.IPCFG - lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) @@ -67,38 +49,6 @@ CS.INIT >LDYA L.LIBTCPIP clc .99 rts *-------------------------------------- -CS.INIT.DEV >LDYA L.DEVNAME - >SYSCALL GetDevByName - bcc .1 - inc DEVNAME+3 - lda DEVNAME+3 - cmp #'8' - bne CS.INIT.DEV - - >LDYA L.MSG.DEV.KO - >SYSCALL printf - - lda #MLI.E.NODEV - sec - rts - -.1 txa - >STA.G hDev - sta IPCFG+S.IPCFG.HDEV - - >PUSHW L.DEVNAME - >LDYA L.MSG.DEV.OK - >SYSCALL printf - - >PUSHWI 0 - >PUSHBI IOCTL.OPEN - >LDA.G hDev - >SYSCALL IOCTL - rts - -.9 sec - rts -*-------------------------------------- CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.POLL clc rts @@ -110,62 +60,19 @@ CS.DOEVENT lda (pEvent) .9 sec never discard TIME event rts *-------------------------------------- -CS.QUIT >LDA.G hDev - beq .1 - - >PUSHWI 0 - >PUSHBI IOCTL.CLOSE - >LDA.G hDev - >SYSCALL IOCTL - -.1 lda hLIBTCPIP +CS.QUIT lda hLIBTCPIP >SYSCALL UnloadLib clc rts -*-------------------------------------- - .INB /A2OSX.SRC/SBIN/TCPIPD.S.CFG *-------------------------------------- CS.END *-------------------------------------- LIBTCPIP .AZ "libtcpip.o" -DEVNAME .AZ "ETH1" -MSG.DEV.KO .AZ "TCPIPD:No Device Found, exiting.\r\n" -MSG.DEV.OK .AZ "TCPIPD:Bound To Device : %s\r\n" -MSG.CFG .AZ "TCPIPD:Reading %s..." -MSG.CFG.KO .AZ "Failed!!! [%h]\r\n" -MSG.CFG.OK .AZ "OK.\r\n" -*-------------------------------------- -HOSTNAME .AZ "${A2OSX}ETC/HOSTNAME" -TCPIP.CONF .AZ "${A2OSX}ETC/TCPIP.CONF" -HOSTS .AZ "${A2OSX}ETC/HOSTS" -DefaultHostName .AZ "a2osx-XXXX" -CFG.Keywords >PSTR "DOMAIN" - >PSTR "IP" - >PSTR "MASK" - >PSTR "GW" - >PSTR "DNS1" - >PSTR "DNS2" -CFG.Keyword.Map .DA #0 End Of Keyword table and NA Keyword - .DA #S.IPCFG.IP - .DA #S.IPCFG.MASK - .DA #S.IPCFG.GW - .DA #S.IPCFG.DNS1 - .DA #S.IPCFG.DNS2 hLIBTCPIP .BS 1 -IPCFG .BS S.IPCFG -CFG.hCfgFile .BS 1 -CFG.hCfgPath .BS 1 -CFG.FileLen .BS 2 -CFG.Keyword .BS 1 -CFG.StrBuf .BS 4 -CFG.HexByte .BS 1 -CFG.IP .BS 5 -UsrBuf256 .BS 256 *-------------------------------------- .DUMMY .OR 0 DS.START -hDev .BS 1 DS.END .ED *-------------------------------------- MAN diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 16279e09..8a98d2b2 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -70,7 +70,7 @@ K.PutS >STYA K.S.IOCTL+S.IOCTL.BUFPTR * # FPutS * Write Str to FILE * ## C -* `int fputs ( const char * str, hFILE stream );` +* `int fputs (hFILE stream, const char * str );` * **In:** * PUSHB : hFILE * Y,A: str @@ -100,6 +100,28 @@ K.FPutS.I jsr IO.SELECT stx K.S.IOCTL+S.IOCTL.BYTECNT+1 jmp IO.Write.I */-------------------------------------- +* # FGetS +* read bytes from stream into the array +* pointed to by s, until n-1 bytes are read, or a is read and +* transferred to s, or an end-of-file condition is encountered. The +* string is then terminated with a null byte. +* ## C +* `char *fgets(hFILE stream, char * s, int n);` +* ## ASM +* **In:** +* `>PUSHW n` +* `>PUSHW s` +* `lda hFILE` +* `>SYSCALL fgets` +* **Out:** +* Y,A: s +* CC = success +*\-------------------------------------- +K.FGetS + + clc + rts +*/-------------------------------------- * # PrintF/SPrintF/FPrintF * Prints C-Style String * ## C @@ -642,6 +664,7 @@ BCDBUF .EQ ARG * + %U : dword * + %h : HEX byte * + %H : HEX word +* + %s : string * `>PUSHW ptr` * `...` * `>PUSHBI bytecount` @@ -681,12 +704,11 @@ K.SScanF >STYA ZPPtr2 String to Scan bne .21 inc ZPPtr1+1 -.21 ldx #K.SScanFJMP-K.SScanFTBL-2 +.21 ldx #K.SScanFCNT-K.SScanFTBL-1 .3 cmp K.SScanFTBL,x beq .4 dex - dex bpl .3 .9 jsr .8 @@ -717,13 +739,13 @@ K.SScanF >STYA ZPPtr2 String to Scan iny sty K.SScanF.ByteIdx - lda K.SScanFTBL+1,x Get VAR size jmp (K.SScanFJMP,x) *-------------------------------------- K.SScanF.ByteCnt .BS 1 K.SScanF.ByteIdx .BS 1 *-------------------------------------- -K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4,#'h,#1,#'H,#2 +K.SScanFTBL .DA #'i,#'d,#'I,#'D,#'l,#'u,#'h,#'H,#'s +K.SScanFCNT .DA #1, #1, #2, #2, #4, #4, #1, #2 K.SScanFJMP .DA K.SScanF.I .DA K.SScanF.D .DA K.SScanF.II @@ -732,28 +754,26 @@ K.SScanFJMP .DA K.SScanF.I .DA K.SScanF.U .DA K.SScanF.H .DA K.SScanF.HH + .DA K.SScanF.S *-------------------------------------- K.SScanF.I K.SScanF.D K.SScanF.II K.SScanF.DD K.SScanF.L -K.SScanF.U pha Save VAL size +K.SScanF.U lda K.SScanFTBL+1,x Get VAR size + pha Save VAL size jsr STDLIB.GetDec bra K.SScanF.GetVAL *-------------------------------------- K.SScanF.HH -K.SScanF.H pha +K.SScanF.H lda K.SScanFTBL+1,x Get VAR size + pha jsr STDLIB.GetHex -K.SScanF.GetVAL tya Y=char count parsed - clc - adc ZPPtr2 - sta ZPPtr2 - bcc .1 - inc ZPPtr2+1 +K.SScanF.GetVAL jsr K.SScanF.Fwd Y=char count parsed .1 ply get back VAL size @@ -763,6 +783,24 @@ K.SScanF.GetVAL tya Y=char count parsed bne .2 .9 rts +*-------------------------------------- +K.SScanF.S ldy #$ff + +.1 iny + lda (ZPPtr2),y + sta (ZPPtr3),y + beq K.SScanF.Fwd + cmp #' ' + bne .1 + iny + +K.SScanF.Fwd tya Y=char count parsed + clc + adc ZPPtr2 + sta ZPPtr2 + bcc .8 + inc ZPPtr2+1 +.8 rts */-------------------------------------- * # FOpen * Open a file