From 1b089829c4034fefbd4ae7ebae0b98508d846a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 23 Jul 2018 08:28:47 +0200 Subject: [PATCH] Kernel 0.9.2 --- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.STARTUP.txt | 10 +- DRV/LANCEGS.DRV.S.txt | 4 +- DRV/UTHER2.AI.DRV.S.txt | 4 +- DRV/UTHERNET.DRV.S.txt | 587 +++++++++++++++++++++++---------------- DRV/UTHERNET2.DRV.S.txt | 4 +- ETC/HOSTNAME | 7 +- ETC/HOSTS | 7 + ETC/TCPIP.CONF | 2 +- INC/A2osX.I.txt | 3 + INC/ETH.I.txt | 15 + INC/LIBTCPIP.I.txt | 12 - INC/MLI.ERR.I.txt | 13 +- INC/NIC.I.txt | 29 +- LIB/LIBCRYPT.S.txt | 2 +- LIB/LIBTCPIP.S.CFG.txt | 40 ++- LIB/LIBTCPIP.S.DNS.txt | 4 +- LIB/LIBTCPIP.S.FRM.txt | 50 ++-- LIB/LIBTCPIP.S.ICMP.txt | 2 + LIB/LIBTCPIP.S.SKT.txt | 4 +- LIB/LIBTCPIP.S.txt | 53 ++-- SBIN/TCPIPD.S.CFG.txt | 2 +- SBIN/TCPIPD.S.txt | 13 +- SYS/KERNEL.S.STDIO.txt | 10 +- 25 files changed, 516 insertions(+), 361 deletions(-) create mode 100644 INC/ETH.I.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index b2d3ffa57d541c70d18d59ee4f7dd2326f3506b7..a5e398b426be7258161fe5eb3c64b1f2ebb47325 100644 GIT binary patch delta 15823 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 N{hQSjyVa8x{SWz+M>zlh diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index d96186edf0066d180d3d19b5563af27450127ce6..36902d802fbbc4e78a18c0a8d0cdfa138c058119 100644 GIT binary patch delta 31765 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 ZPTmpPTR dey bne .2 - lda #ERR.DEV.NOBUFFER + lda #MLI.E.EOF sec rts diff --git a/DRV/UTHER2.AI.DRV.S.txt b/DRV/UTHER2.AI.DRV.S.txt index cc91d02f..7ef2f213 100644 --- a/DRV/UTHER2.AI.DRV.S.txt +++ b/DRV/UTHER2.AI.DRV.S.txt @@ -169,7 +169,7 @@ READBLOCK ldx DEVSLOTx0 ora W5100.DR,x LO bne READBLOCK.RxOK - lda #ERR.DEV.NOFRAME + lda #MLI.E.EOF sec READBLOCK.RTS rts @@ -309,7 +309,7 @@ WRITEBLOCK >STYA ZPTmpPTR sbc RXTX.Size+1 bcs WRITEBLOCK.1 - lda #ERR.DEV.NOBUFFER + lda #MLI.E.EOF sec rts diff --git a/DRV/UTHERNET.DRV.S.txt b/DRV/UTHERNET.DRV.S.txt index 6b243076..c0d1d5dd 100644 --- a/DRV/UTHERNET.DRV.S.txt +++ b/DRV/UTHERNET.DRV.S.txt @@ -4,18 +4,16 @@ AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 - .TF /A2OSX.BUILD/DRV/UTHERNET.DRV + .TF DRV/UTHERNET.DRV *-------------------------------------- - .INB /A2OSX.BUILD/INC/MACROS.I - .INB /A2OSX.BUILD/INC/A2OSX.I - .INB /A2OSX.BUILD/INC/MLI.ERR.I - .INB /A2OSX.BUILD/INC/NIC.I - .INB /A2OSX.BUILD/INC/NIC.8900A.I - .INB /A2OSX.BUILD/INC/LIBTCPIP.I + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/MLI.ERR.I + .INB INC/NIC.I + .INB INC/NIC.8900A.I + .INB INC/ETH.I *-------------------------------------- -ZPTmpPTR .EQ ZPDRV -Size .EQ ZPDRV+2 -Counter .EQ ZPDRV+4 +ZPArgPtr .EQ ZPDRV *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- @@ -25,19 +23,29 @@ CS.START cld .DA #1 DRV Layout Version 1 .DA 0 .DA CS.END-CS.START Code Length - .DA DEV.HEADER-CS.START Device Header Offset - .DA DRV.CS.START-CS.START Driver Code Offset - .DA DRV.CS.END-DRV.CS.START Drv Code Length + .DA 0 + .DA 0 + .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT L.MSG.DETECT.OK .DA MSG.DETECT.OK L.MSG.DETECT.KO .DA MSG.DETECT.KO -L.DEV.HEADER.NAME .DA DEV.HEADER.NAME +L.DRV.CS.START .DA DRV.CS.START +L.FD.DEV .DA FD.DEV +L.FD.DEV.NAME .DA FD.DEV.NAME +L.SSCANF.MAC .DA SSCANF.MAC +L.MAC0 .DA DCB+S.DCB.NIC.MAC +L.MAC1 .DA DCB+S.DCB.NIC.MAC+1 +L.MAC2 .DA DCB+S.DCB.NIC.MAC+2 +L.MAC3 .DA DCB+S.DCB.NIC.MAC+3 +L.MAC4 .DA DCB+S.DCB.NIC.MAC+4 +L.MAC5 .DA DCB+S.DCB.NIC.MAC+5 .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >STYA ARGS + >LDYA L.MSG.DETECT >SYSCALL printf @@ -60,7 +68,7 @@ Dev.Detect >STYA ARGS cmp #DEVID beq .3 -.2 dec DEV.HEADER.NAME+3 +.2 dec FD.DEV.NAME+3 txa sec sbc #$10 @@ -85,77 +93,132 @@ Dev.Detect >STYA ARGS sta PacketPagePTR,x lda PacketPageDATA+1,x - sta DEVSTAT+S.DIB.VERSION+1 set Hardware version + sta DIB+S.DIB.VERSION+1 set Hardware version lda PacketPageDATA,x - sta DEVSTAT+S.DIB.VERSION + sta DIB+S.DIB.VERSION - >LDYA ARGS - >STYA ZPTmpPTR + jsr Dev.ParseArgs + bcs .9 + +.8 >PUSHW L.FD.DEV.NAME + >LDYA L.MSG.DETECT.OK + + >PUSHWI DRV.END + >PUSHWI DRV.CS.END + >PUSHWI DRV.CS.START + >LDYA L.DRV.CS.START + >SYSCALL InsDrv + bcs .9 + >STYA FD.DEV+S.FD.DEV.DRVPTR + + >LDYA L.FD.DEV + >SYSCALL MKDEV - lda (ZPTmpPTR) - bne .4 +.9 rts +*-------------------------------------- +Dev.ParseArgs >LDYA ARGS + >STYA ZPArgPTR + lda (ZPArgPTR) + bne .1 - lda #$00 - sta MAC - lda #$0E - sta MAC+1 - lda #$3A - sta MAC+2 lda A2osX.RANDOM16 eor A2osX.TIMER16 - sta MAC+3 + sta DCB+S.DCB.NIC.MAC+3 eor A2osX.RANDOM16+1 - sta MAC+4 + sta DCB+S.DCB.NIC.MAC+4 eor A2osX.TIMER16+1 - sta MAC+5 - bra .8 - -.4 jsr DecodeMac - bcc .8 - lda #K.E.SYN - sec - rts - -.8 >PUSHW L.DEV.HEADER.NAME - >LDYA L.MSG.DETECT.OK - >SYSCALL printf + sta DCB+S.DCB.NIC.MAC+5 clc rts -*-------------------------------------- - .INB /A2OSX.SRC/DRV/X.NET.DRV.S + +.1 >PUSHW L.MAC5 + >PUSHW L.MAC4 + >PUSHW L.MAC3 + >PUSHW L.MAC2 + >PUSHW L.MAC1 + >PUSHW L.MAC0 + >PUSHBI 12 6 x byte PTRs + >PUSHW L.SSCANF.MAC + >LDYA ZPArgPtr + >SYSCALL sscanf + bcc .8 + + lda #K.E.SYN + sec +.8 rts *-------------------------------------- CS.END +ARGS .BS 2 MSG.DETECT .AZ "UtherNet/CS8900A Driver.\r\n" MSG.DETECT.OK .AZ "UtherNet/CS8900A Installed As Device : %s\r\n" MSG.DETECT.KO .AZ "Hardware Not Found.\r\n" -ARGS .BS 2 +SSCANF.MAC .AZ "%h:%h:%h:%h:%h:%h" *-------------------------------------- -* Device Header (16 Bytes) -*-------------------------------------- -DEV.HEADER cld - jmp (DRV.CS.START,x) - .DA #0 - .BS 6 -DEV.HEADER.NAME .AZ "ETH7" NAME +FD.DEV .DA #S.FD.T.CDEV + .DA #0 HANDLER + .DA #0 BUSID + .DA #0 DEVID + .DA 0 BUSPTR + .BS 2 DRVPTR +FD.DEV.NAME .AZ "ETH7" NAME + .HS 000000 *-------------------------------------- * Driver Code *-------------------------------------- -DRV.CS.START .DA STATUS - .DA READBLOCK - .DA WRITEBLOCK +ZPIOCTL .EQ ZPDRV +ZPBufPtr .EQ ZPDRV+2 +Size .EQ ZPDRV+4 +Counter .EQ ZPDRV+6 +*-------------------------------------- +DRV.CS.START cld + jmp (.1,x) +.1 .DA STATUS .DA A2osX.BADCALL .DA A2osX.BADCALL .DA A2osX.BADCALL + .DA CONTROL + .DA A2osX.BADCALL .DA OPEN .DA CLOSE - .DA A2osX.BADCALL - .DA A2osX.BADCALL -L.DEVSTAT .DA DEVSTAT + .DA READ + .DA WRITE + .DA A2osX.BADCALL IRQ .DA 0 end or relocation *-------------------------------------- -STATUS lda #S.DIB.NIC.STATUS.10 - sta LINK.STATUS +STATUS >STYA ZPIOCTL + ldy #S.IOCTL.STATCODE + lda (ZPIOCTL),y + beq .1 + + cmp #S.IOCTL.STATCODE.GETDIB + bne STATUS.DCB + + ldx #S.DIB-1 + .HS 2C bit abs +.1 ldx #3 + + ldy #S.IOCTL.BUFPTR + lda (ZPIOCTL),y + sta .3+1 + iny + lda (ZPIOCTL),y + sta .3+2 + +.2 lda DIB,x +.3 sta $ffff,x SELF MODIFIED + dex + bpl .2 + + clc + rts + +STATUS.DCB cmp #S.IOCTL.STATCODE.GETDCB + bne STATUS.9 + lda #S.DCB.NIC.SPEED.10 + sta DCB+S.DCB.NIC.SPEED + stz DCB+S.DCB.NIC.LINK + ldx DEVSLOTx0 lda /PP.LineST @@ -168,11 +231,10 @@ STATUS lda #S.DIB.NIC.STATUS.10 and #PP.LineST.LinkOK beq .1 - lda LINK.STATUS - ora #S.DIB.NIC.STATUS.OK - sta LINK.STATUS + lda #S.DCB.NIC.LINK.OK + tsb DCB+S.DCB.NIC.LINK -.1 lda /PP.TestCTL + lda /PP.TestCTL sta PacketPagePTR+1,x lda #PP.TestCTL sta PacketPagePTR,x @@ -180,187 +242,55 @@ STATUS lda #S.DIB.NIC.STATUS.10 lda PacketPageDATA+1,x ldy PacketPageDATA,x and /PP.TestCTL.FDX - beq .2 + beq .1 - lda LINK.STATUS - ora #S.DIB.NIC.STATUS.FD - sta LINK.STATUS - -.2 >LDYA L.DEVSTAT - clc - rts -*-------------------------------------- -READBLOCK php - sei - - ldx DEVSLOTx0 - - lda /PP.RxEvent - sta PacketPagePTR+1,x - lda #PP.RxEvent - sta PacketPagePTR,x - - lda PacketPageDATA+1,x - ldy PacketPageDATA,x - and /PP.RxEvent.RxOK+PP.RxEvent.IA+PP.RxEvent.Brdcast+PP.RxEvent.Runt - bne .1 - - lda #ERR.DEV.NOFRAME - -.9 plp - sec - rts - -.1 lda RTDATA+1,x discard RxStatus - lda RTDATA,x - - lda RTDATA+1,x - sta Size+1 - - lda RTDATA,x get RxLength - sta Size - clc - adc #2 - tay - - lda Size+1 - adc #0 - - >SYSCALL getmem - bcs .9 - - >STYA ZPTmpPTR - stx .8+1 - sty .8+3 - sta .8+5 - - lda Size - sta (ZPTmpPTR) - eor #$ff - sta Counter - ldy #1 - lda Size+1 - sta (ZPTmpPTR),y - eor #$ff - sta Counter+1 + lda #S.DCB.NIC.LINK.FD + tsb DCB+S.DCB.NIC.LINK +.1 ldy #S.IOCTL.BUFPTR + lda (ZPIOCTL),y + sta .3+1 iny + lda (ZPIOCTL),y + sta .3+2 - ldx DEVSLOTx0 - -.2 inc Counter - bne .3 - inc Counter+1 - beq .8 + ldx #S.DCB.NIC-1 -.3 lda RTDATA,x - sta (ZPTmpPTR),y - iny - bne .4 - inc ZPTmpPTR+1 - -.4 inc Counter - bne .5 - inc Counter+1 - beq .8 - -.5 lda RTDATA+1,x - sta (ZPTmpPTR),y - iny - bne .2 - inc ZPTmpPTR+1 - bne .2 - -.8 ldx #$ff hMem - ldy #$ff PtrLO - lda #$ff PtrHI - - plp - clc - rts -*-------------------------------------- -WRITEBLOCK php - sei - >STYA ZPTmpPTR - - ldx #5 - ldy #S.ETH.SRCMAC+5 - -.10 lda MAC,x - sta (ZPTmpPTR),y - dey +.2 lda DCB,x +.3 sta $ffff,x SELF MODIFIED dex - bpl .10 + bpl .2 - ldx DEVSLOTx0 - - lda /PP.TxCMD.LID+PP.TxCMD.TxStartFULL - sta TxCMD+1,x - lda #PP.TxCMD.LID+PP.TxCMD.TxStartFULL - sta TxCMD,x - - ldy #1 - lda (ZPTmpPTR),y - sta TxLength+1,x - eor #$ff - sta Counter+1 - - lda (ZPTmpPTR) - sta TxLength,x - eor #$ff - sta Counter - - lda /PP.BusST - sta PacketPagePTR+1,x - lda #PP.BusST - sta PacketPagePTR,x - - ldy #16 - -.1 lda PacketPageDATA+1,x - and /PP.BusST.Rdy4TxNOW - bne WRITEBLOCK.1 - - lda PacketPageDATA,x - and #PP.BusST.TxBidErr - bne .9 - - dey - bne .1 - -.9 lda #ERR.DEV.NOBUFFER - plp - sec + clc rts -WRITEBLOCK.1 ldy #2 +STATUS.9 lda #MLI.E.BADCTL + sec + rts +*-------------------------------------- +CONTROL >STYA ZPIOCTL -.1 inc Counter - bne .2 - inc Counter+1 - beq .8 + ldy #S.IOCTL.CTRLCODE + lda (ZPIOCTL),y + cmp #S.IOCTL.CTRLCODE.SETDCB + bne STATUS.9 -.2 lda (ZPTmpPTR),y - sta RTDATA,x +.1 ldy #S.IOCTL.BUFPTR + lda (ZPIOCTL),y + sta .2+1 iny - bne .3 - inc ZPTmpPTR+1 + lda (ZPIOCTL),y + sta .2+2 -.3 inc Counter - bne .4 - inc Counter+1 - beq .8 + ldx #S.DCB.NIC-1 -.4 lda (ZPTmpPTR),y - sta RTDATA+1,x - iny - bne .1 - inc ZPTmpPTR+1 - bne .1 +.2 lda $ffff,x SELF MODIFIED + sta DCB,x + dex + bpl .2 -.8 plp clc - rts + rts *-------------------------------------- OPEN jsr CLOSE @@ -379,15 +309,15 @@ OPEN jsr CLOSE lda #PP.MAC sta PacketPagePTR,x - >LDYA MAC + >LDYA DCB+S.DCB.NIC.MAC >STYA PacketPageDATA,x >LDYAI PP.MAC+2 >STYA PacketPagePTR,x - >LDYA MAC+2 + >LDYA DCB+S.DCB.NIC.MAC+2 >STYA PacketPageDATA,x >LDYAI PP.MAC+4 >STYA PacketPagePTR,x - >LDYA MAC+4 + >LDYA DCB+S.DCB.NIC.MAC+4 >STYA PacketPageDATA,x lda /PP.LineCTL @@ -400,6 +330,9 @@ OPEN jsr CLOSE lda #PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.10BaseT sta PacketPageDATA,x + lda #S.DIB.S.OPENED + tsb DIB+S.DIB.S + clc rts *-------------------------------------- @@ -432,22 +365,200 @@ CLOSE ldx DEVSLOTx0 iny bne .1 -.8 clc +.8 lda #S.DIB.S.OPENED + trb DIB+S.DIB.S + + clc rts *-------------------------------------- +READ >STYA ZPIOCTL + + php + sei + + ldx DEVSLOTx0 + + lda /PP.RxEvent + sta PacketPagePTR+1,x + lda #PP.RxEvent + sta PacketPagePTR,x + + lda PacketPageDATA+1,x + ldy PacketPageDATA,x + and /PP.RxEvent.RxOK+PP.RxEvent.IA+PP.RxEvent.Brdcast+PP.RxEvent.Runt + bne .1 + + lda #MLI.E.EOF + +.9 plp + sec + rts + +.1 lda RTDATA+1,x discard RxStatus + lda RTDATA,x + + lda RTDATA+1,x + sta Size+1 + + ldy RTDATA,x get RxLength + sty Size + + >SYSCALL getmem + bcs .9 + + >STYA ZPBufPtr + stx .8+1 + + lda Size + eor #$ff + sta Counter + ldy #1 + lda Size+1 + eor #$ff + sta Counter+1 + + ldy #0 + + ldx DEVSLOTx0 + +.2 inc Counter + bne .3 + inc Counter+1 + beq .8 + +.3 lda RTDATA,x + sta (ZPBufPtr),y + iny + bne .4 + inc ZPBufPtr+1 + +.4 inc Counter + bne .5 + inc Counter+1 + beq .8 + +.5 lda RTDATA+1,x + sta (ZPBufPtr),y + iny + bne .2 + inc ZPBufPtr+1 + bne .2 + +.8 lda #$ff SELF MODIFIED hMem + + plp + clc + rts +*-------------------------------------- +WRITE >STYA ZPIOCTL + + ldy #S.IOCTL.BUFPTR + lda (ZPIOCTL),y + sta ZPBufPtr + iny + lda (ZPIOCTL),y + sta ZPBufPtr+1 + + ldx #5 + ldy #S.ETH.SRCMAC+5 + +.10 lda DCB+S.DCB.NIC.MAC,x + sta (ZPBufPtr),y + dey + dex + bpl .10 + + php + sei + + ldx DEVSLOTx0 + + lda /PP.TxCMD.LID+PP.TxCMD.TxStartFULL + sta TxCMD+1,x + lda #PP.TxCMD.LID+PP.TxCMD.TxStartFULL + sta TxCMD,x + + ldy #S.IOCTL.BYTECNT+1 + lda (ZPIOCTL),y + sta TxLength+1,x + eor #$ff + sta Counter+1 + + dey + lda (ZPIOCTL),y + sta TxLength,x + eor #$ff + sta Counter + + lda /PP.BusST + sta PacketPagePTR+1,x + lda #PP.BusST + sta PacketPagePTR,x + + ldy #16 + +.1 lda PacketPageDATA+1,x + and /PP.BusST.Rdy4TxNOW + bne WRITE.1 + + lda PacketPageDATA,x + and #PP.BusST.TxBidErr + bne .9 + + dey + bne .1 + +.9 lda #MLI.E.EOF + plp + sec + rts + +WRITE.1 ldy #0 + +.1 inc Counter + bne .2 + inc Counter+1 + beq .8 + +.2 lda (ZPBufPtr),y + sta RTDATA,x + iny + bne .3 + inc ZPBufPtr+1 + +.3 inc Counter + bne .4 + inc Counter+1 + beq .8 + +.4 lda (ZPBufPtr),y + sta RTDATA+1,x + iny + bne .1 + inc ZPBufPtr+1 + bne .1 + +.8 plp + clc + rts +*-------------------------------------- DRV.CS.END DEVSLOTx0 .BS 1 *-------------------------------------- -DEVSTAT .DA #0 - .BS 3 size +DIB .DA #0 + .DA #0,#0,#0 size >PSTR "Uthernet/CS8900A" - .DA #S.DIB.T.NET + .DA #S.DIB.T.NIC .BS 1 Subtype .BS 2 Version *-------------------------------------- -FLAGS .DA #0 -LINK.STATUS .BS 1 OK/DUPLEX/SPEED -MAC .BS 6 +DCB .DA #S.DCB.T.NIC + .BS 1 FLAGS + .BS 1 LINK + .BS 1 SPEED + .HS 000E3A123456 MAC +*-------------------------------------- +DRV.END MAN SAVE /A2OSX.SRC/DRV/UTHERNET.DRV.S ASM diff --git a/DRV/UTHERNET2.DRV.S.txt b/DRV/UTHERNET2.DRV.S.txt index f2313beb..f334d68c 100644 --- a/DRV/UTHERNET2.DRV.S.txt +++ b/DRV/UTHERNET2.DRV.S.txt @@ -169,7 +169,7 @@ READBLOCK ldx DEVSLOTx0 ora W5100.DR,x LO bne READBLOCK.RxOK - lda #ERR.DEV.NOFRAME + lda #MLI.E.EOF sec rts @@ -276,7 +276,7 @@ WRITEBLOCK >STYA ZPTmpPTR sbc RXTX.Size+1 bcs WRITEBLOCK.1 - lda #ERR.DEV.NOBUFFER + lda #MLI.E.EOF sec rts diff --git a/ETC/HOSTNAME b/ETC/HOSTNAME index ff3d9873..085880f5 100644 --- a/ETC/HOSTNAME +++ b/ETC/HOSTNAME @@ -1 +1,6 @@ -apple2-host \ No newline at end of file +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 +a2osx-host +MAN +TEXT ETC/HOSTNAME diff --git a/ETC/HOSTS b/ETC/HOSTS index e69de29b..758371b1 100644 --- a/ETC/HOSTS +++ b/ETC/HOSTS @@ -0,0 +1,7 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 +# put your IP address and your hostname and aliases below +# 1.2.3.4 myserver.mydomain myserver +MAN +TEXT ETC/HOSTS diff --git a/ETC/TCPIP.CONF b/ETC/TCPIP.CONF index ed35536b..fdef07cf 100644 --- a/ETC/TCPIP.CONF +++ b/ETC/TCPIP.CONF @@ -3,7 +3,7 @@ PREFIX /A2OSX.BUILD AUTO 4,1 IP=192.168.1.150 MASK=255.255.255.0 -GW=192.168.1.1 +GW=192.168.1.254 DNS1=192.168.1.2 DNS2=192.168.1.1 DOMAIN=coincoin.hd.free.fr diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 0386c175..bd13f4d0 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -327,6 +327,9 @@ S.IOCTL.ADDRPTR .EQ 6 3 BYTES * S.IOCTL .EQ 9 *-------------------------------------- +S.DCB.T .EQ 0 +S.DCB.T.NIC .EQ $12 +*-------------------------------------- S.DIB.S .EQ 0 S.DIB.S.BLOCK .EQ %10000000 S.DIB.S.WRITE .EQ %01000000 diff --git a/INC/ETH.I.txt b/INC/ETH.I.txt new file mode 100644 index 00000000..0ba134bb --- /dev/null +++ b/INC/ETH.I.txt @@ -0,0 +1,15 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +S.ETH.DSTMAC .EQ 0 +S.ETH.SRCMAC .EQ 6 +S.ETH.ETHERTYPE .EQ 12 +S.ETH.ETHERTYPE.IP .EQ $800 +S.ETH.ETHERTYPE.ARP .EQ $806 +* +S.ETH .EQ 6+6+2 +*-------------------------------------- +MAN +SAVE INC/ETH.I diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 4dda77b4..65ed7c37 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -70,9 +70,6 @@ ERR.ARP.PENDING .EQ $B5 ERR.ARP.ERROR .EQ $B4 ERR.DEV .EQ $B3 - -ERR.DEV.NOBUFFER .EQ $B1 -ERR.DEV.NOFRAME .EQ $B0 *-------------------------------------- UDP.PORT.DNS .EQ 53 UDP.PORT.PMAP .EQ 111 @@ -189,15 +186,6 @@ S.TCB.OUTACKNUM .EQ 32 Send:ACK to send to remote * S.TCB .EQ 36 *-------------------------------------- -S.ETH.FRAMELEN .EQ 0 -S.ETH.DSTMAC .EQ 2 -S.ETH.SRCMAC .EQ 8 -S.ETH.ETHERTYPE .EQ 14 -S.ETH.ETHERTYPE.IP .EQ $800 -S.ETH.ETHERTYPE.ARP .EQ $806 -* -S.ETH .EQ 2+6+6+2 -*-------------------------------------- S.ARP.HTYPE .EQ S.ETH+0 $0001 S.ARP.PTYPE .EQ S.ETH+2 $0800 S.ARP.HLEN .EQ S.ETH+4 $06 diff --git a/INC/MLI.ERR.I.txt b/INC/MLI.ERR.I.txt index e9d9b7d8..454ac8f2 100644 --- a/INC/MLI.ERR.I.txt +++ b/INC/MLI.ERR.I.txt @@ -8,6 +8,7 @@ AUTO 6 *$00 - No Error MLI.E.BADCALL .EQ $01 Bad Call Number *MLI.E.BADCNT .EQ $04 Bad Parameter Count +*MLI.E.BUSERR .EQ $06 Communications Error MLI.E.BADCTL .EQ $21 Invalid Status Code *MLI.E.IRQFULL .EQ $25 Interrupt Table Full MLI.E.IO .EQ $27 I/O Error @@ -30,12 +31,12 @@ MLI.E.EOF .EQ $4C End of File, No More Data MLI.E.BEYEOF .EQ $4D Beyond EOF MLI.E.LOCKED .EQ $4E File Access Error, File Locked MLI.E.OPEN .EQ $50 File Already Open -*$51 - Directory Structure Damaged -*$53 - Invalid Parameter -*$55 - Too Many Volumes -*$56 - Bad Buffer Address -*$57 - Duplicate Volume -*$5A - File Structure Damaged +* .EQ $51 Directory Structure Damaged +* .EQ $53 Invalid Parameter +* .EQ $55 Too Many Volumes +* .EQ $56 Bad Buffer Address +* .EQ $57 Duplicate Volume +* .EQ $5A File Structure Damaged *-------------------------------------- MAN SAVE /A2OSX.BUILD/INC/MLI.ERR.I diff --git a/INC/NIC.I.txt b/INC/NIC.I.txt index e7df9a2f..1582166f 100644 --- a/INC/NIC.I.txt +++ b/INC/NIC.I.txt @@ -5,17 +5,22 @@ AUTO 4,1 *-------------------------------------- * NIC Devices *-------------------------------------- -S.DIB.NIC.FLAGS .EQ S.DIB -S.DIB.NIC.FLAGS.ARPOFFLOAD .EQ %00000001 -S.DIB.NIC.FLAGS.IPOFFLOAD .EQ %00000010 -S.DIB.NIC.STATUS .EQ S.DIB+1 -S.DIB.NIC.STATUS.OK .EQ $80 -S.DIB.NIC.STATUS.FD .EQ $40 -S.DIB.NIC.STATUS.10 .EQ $01 -S.DIB.NIC.STATUS.100 .EQ $02 -S.DIB.NIC.STATUS.1000 .EQ $03 -S.DIB.NIC.MAC .EQ S.DIB+2 -S.DIB.NIC .EQ S.DIB+8 +S.DCB.NIC.FLAGS .EQ 1 +S.DCB.NIC.FLAGS.ARPOFFLOAD .EQ %00000001 +S.DCB.NIC.FLAGS.IPOFFLOAD .EQ %00000010 +S.DCB.NIC.LINK .EQ 2 +S.DCB.NIC.LINK.OK .EQ $80 +S.DCB.NIC.LINK.FD .EQ $40 +S.DCB.NIC.SPEED .EQ 3 +S.DCB.NIC.SPEED.10 .EQ $01 +S.DCB.NIC.SPEED.100 .EQ $02 +S.DCB.NIC.SPEED.1000 .EQ $03 +S.DCB.NIC.MAC .EQ 4 +S.DCB.NIC.IP .EQ 10 +S.DCB.NIC.MASK .EQ 14 +S.DCB.NIC.GW .EQ 18 +* +S.DCB.NIC .EQ 22 *-------------------------------------- MAN -SAVE /A2OSX.BUILD/INC/NIC.I +SAVE INC/NIC.I diff --git a/LIB/LIBCRYPT.S.txt b/LIB/LIBCRYPT.S.txt index 23670aad..99a096c4 100644 --- a/LIB/LIBCRYPT.S.txt +++ b/LIB/LIBCRYPT.S.txt @@ -126,7 +126,7 @@ MD5 >STYA ZPDataPtr >PULLW ZPHashPtr >PULLYA - >SYSCALL StrLen.YA + >SYSCALL strlen >STYA ZPDataLen .1 jsr MD5Init diff --git a/LIB/LIBTCPIP.S.CFG.txt b/LIB/LIBTCPIP.S.CFG.txt index 938ad881..85fd2395 100644 --- a/LIB/LIBTCPIP.S.CFG.txt +++ b/LIB/LIBTCPIP.S.CFG.txt @@ -32,21 +32,32 @@ SET.IPCFG >PULLW ZPTmpPtr1 sta DNS.SOCKET.SA,x dex bpl .3 - - lda IPCFG+S.IPCFG.HDEV - >SYSCALL GetDevStatus + + >LDYA L.DCB.NIC + >STYA IOCTL+S.IOCTL.BUFPTR + lda S.IOCTL.STATCODE.GETDCB + sta S.IOCTL.STATCODE + + ldx IOCTL.STATUS + jsr SET.IPCFG.IOCTL >STYA ZPTmpPtr2 - ldy #S.DIB.NIC.FLAGS - lda (ZPTmpPtr2),y - sta DevFlags - and #S.DIB.NIC.FLAGS.ARPOFFLOAD + lda DCB.NIC+S.DCB.NIC.FLAGS + and #S.DCB.NIC.FLAGS.ARPOFFLOAD beq .4 - >PUSHB IPCFG+S.IPCFG.HDEV - >PUSHBI DEVMGR.CONTROL - >PUSHW ZPTmpPtr1 - >SYSCALL IOCTL + ldx #11 + +.31 lda IPCFG+S.IPCFG.IP,x + sta DCB.NIC+S.DCB.NIC.IP,x + dex + bpl .31 + +* lda S.IOCTL.CTRLCODE.SETDCB same as lda S.IOCTL.STATCODE.GETDCB +* sta S.IOCTL.CTRLCODE same as sta S.IOCTL.STATCODE + + lda IPCFG+S.IPCFG.HDEV + jsr SET.IPCFG.IOCTL .4 lda hDNSSocket1 beq .41 @@ -99,6 +110,13 @@ SET.IPCFG >PULLW ZPTmpPtr1 .8 >LDYA ZPTmpPtr1 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.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 9e9596e9..05deaa93 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -154,7 +154,7 @@ DNS.ADD.I sta DNS.TmpCache jsr DNS.FIND.FREE >LDYA ZPPtrDNS - >SYSCALL NewStr.YA + >SYSCALL newstr bcs .9 txa ldy #S.DNSCACHE.hNAME @@ -489,7 +489,7 @@ DNS.CSTR2DNS lda (ZPPtrDNS) beq .9 >LDYA ZPPtrDNS - >SYSCALL StrLen.YA + >SYSCALL strlen tax bne .9 diff --git a/LIB/LIBTCPIP.S.FRM.txt b/LIB/LIBTCPIP.S.FRM.txt index e5a84f2b..81a9039f 100644 --- a/LIB/LIBTCPIP.S.FRM.txt +++ b/LIB/LIBTCPIP.S.FRM.txt @@ -15,33 +15,26 @@ FRM.NewIP stx .8+1 >STYA ZPDataOutLen cpx #S.IP.PROTOCOL.TCP bne .1 - lda #S.TCP-2 + lda #S.TCP bra .4 .1 cpx #S.IP.PROTOCOL.UDP bne .2 - lda #S.UDP-2 + lda #S.UDP bra .4 -.2 lda #S.IP-2 +.2 lda #S.IP bra .4 .4 sta .5+1 save Header len for reset later clc adc ZPDataOutLen sta ZPFrameOutLen - pha + tay lda #0 adc ZPDataOutLen+1 sta ZPFrameOutLen+1 - tax - - pla - adc #2 - tay - txa - adc #0 >SYSCALL getmem bcs .9 @@ -49,13 +42,7 @@ FRM.NewIP stx .8+1 stx hFrameOut >STYA ZPFrameOutPtr - lda ZPFrameOutLen - sta (ZPFrameOutPtr) - ldy #1 - lda ZPFrameOutLen+1 - sta (ZPFrameOutPtr),y - - iny + ldy #0 .5 ldx #$ff Self Modified, header length @@ -75,8 +62,8 @@ FRM.NewIP stx .8+1 adc ZPFrameOutPtr+1 sta ZPDataOutPtr+1 - lda DevFlags - and #S.DIB.NIC.FLAGS.IPOFFLOAD + lda DCB.NIC+S.DCB.NIC.FLAGS + and #S.DCB.NIC.FLAGS.IPOFFLOAD bne .7 ldy #S.ETH.ETHERTYPE @@ -135,8 +122,8 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload dex bpl .1 - lda DevFlags - and #S.DIB.NIC.FLAGS.IPOFFLOAD + lda DCB.NIC+S.DCB.NIC.FLAGS + and #S.DCB.NIC.FLAGS.IPOFFLOAD bne .21 ldy #S.IP.TOTAL.LENGTH+1 @@ -198,13 +185,13 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload lda ZPFrameOutLen sec - sbc #S.IP-2 + sbc #S.IP ldy #S.UDP.LENGTH+1 sta (ZPFrameOutPtr),y lda ZPFrameOutLen+1 - sbc /S.IP-2 + sbc /S.IP dey sta (ZPFrameOutPtr),y @@ -216,8 +203,8 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload bne .5 jsr ICMP.ComputeChecksum -.5 lda DevFlags - and #S.DIB.NIC.FLAGS.ARPOFFLOAD +.5 lda DCB.NIC+S.DCB.NIC.FLAGS + and #S.DCB.NIC.FLAGS.ARPOFFLOAD bne .6 jsr IP.SetDestMAC @@ -297,11 +284,12 @@ FRM.Retry ldx FRM.QUEUE.Tail .8 rts *-------------------------------------- -FRM.Send.YA pha - >PUSHB IPCFG+S.IPCFG.HDEV - >PUSHBI DEVMGR.WRITEBLOCK - pla - >PUSHYA +FRM.Send.YA *****>PUSHYA + + >PUSHW L.IOCTL + >PUSHBI IOCTL.WRITE + lda IPCFG+S.IPCFG.HDEV + >SYSCALL IOCTL try sending again to DRV rts *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.ICMP.txt b/LIB/LIBTCPIP.S.ICMP.txt index 42347fe8..19932b0d 100644 --- a/LIB/LIBTCPIP.S.ICMP.txt +++ b/LIB/LIBTCPIP.S.ICMP.txt @@ -61,6 +61,8 @@ ICMP.IN.ECHOREQ ldy #S.IP.DST+3 jsr ARP.ADD.I lda hFrameIn + stz hFrameIn + sta hFrameOut DO NOT DISCARD this frame,it is SOURCE frame!!! >LDYA ZPFrameInPtr >STYA ZPFrameOutPtr diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 27959523..dbb532f4 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -302,7 +302,7 @@ SKT.AcceptA jsr SKT.GetA.I *\-------------------------------------- SKT.MkNodA sta .1+1 >LDYAI S.FD.SSOCK - >SYSCALL GetMem0.YA + >SYSCALL getmem0 bcs .9 >STYA ZPTmpPtr1 @@ -1138,7 +1138,7 @@ SKT.AckDataToSktOut .8 rts *-------------------------------------- SKT.NewTCB >LDYAI S.TCB - >SYSCALL GetMem0.YA + >SYSCALL getmem0 bcs .9 >STYA .4+1 diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 04c518e7..0714507a 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -4,13 +4,14 @@ AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 - .TF /A2OSX.BUILD/LIB/LIBTCPIP.O + .TF LIB/LIBTCPIP.O *-------------------------------------- - .INB /A2OSX.BUILD/INC/MACROS.I - .INB /A2OSX.BUILD/INC/A2OSX.I - .INB /A2OSX.BUILD/INC/MLI.ERR.I - .INB /A2OSX.BUILD/INC/NIC.I - .INB /A2OSX.BUILD/INC/LIBTCPIP.I + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/MLI.ERR.I + .INB INC/NIC.I + .INB INC/ETH.I + .INB INC/LIBTCPIP.I *-------------------------------------- ZPFrameInPtr .EQ ZPLIB ZPFrameInLen .EQ ZPLIB+2 @@ -96,6 +97,8 @@ L.DNS.CACHE .DA DNS.CACHE L.SKT.Template .DA SKT.Template L.HST.SScanF .DA HST.SScanF L.TmpByte .DA TmpByte +L.IOCTL .DA IOCTL +L.DCB.NIC .DA DCB.NIC L.TCP.IN.JMP .DA TCP.IN.JMP.CLOSED .DA TCP.IN.JMP.LISTEN .DA TCP.IN.JMP.SYNSENT @@ -117,7 +120,7 @@ LIB.LOAD ldx RefCount jsr DNS.CLEAR >LDYAI K.SKTTABLE.SIZE*S.SOCKET - >SYSCALL GetMem0.YA + >SYSCALL getmem0 bcs .9 stx hSocketTable @@ -127,30 +130,31 @@ LIB.LOAD ldx RefCount .9 rts *-------------------------------------- LIB.UNLOAD dec RefCount - bne .8 + bne LIB.UNLOAD.8 lda hSocketTable - beq .8 + beq LIB.UNLOAD.8 >SYSCALL FreeMem -.8 clc +LIB.UNLOAD.8 clc rts *-------------------------------------- -POLL >PUSHB IPCFG+S.IPCFG.HDEV - >PUSHBI DEVMGR.READBLOCK - >PUSHW 0 +POLL >PUSHW L.IOCTL + >PUSHBI IOCTL.READ + lda IPCFG+S.IPCFG.HDEV >SYSCALL IOCTL bcs .99 No Frame - stx hFrameIn - >STYA ZPFrameInPtr + sta hFrameIn - lda (ZPFrameInPtr) Get Frame Len - sta ZPFrameInLen - ldy #1 - lda (ZPFrameInPtr),y - sta ZPFrameInLen+1 + ldx #S.IOCTL.BUFPTR + +.10 lda IOCTL,x Get Frame Ptr & Len + sta ZPFrameInPtr,x + inx + cpx S.IOCTL.BUFPTR+4 + bne .10 ldy #S.ETH.ETHERTYPE lda (ZPFrameInPtr),y @@ -173,7 +177,9 @@ POLL >PUSHB IPCFG+S.IPCFG.HDEV jmp IP.IN .9 lda hFrameIn + beq LIB.UNLOAD.8 >SYSCALL FreeMem + .99 rts *-------------------------------------- * Expire = every sec @@ -222,7 +228,7 @@ GetDynPort inc DYNPORT.LAST *-------------------------------------- CS.END *-------------------------------------- -ARP.REQ .DA S.ARP-2 Frame size +ARP.REQ .DA S.ARP Frame size ARP.REQ.DSTMAC .HS FFFFFFFFFFFF ARP.REQ.SRCMAC .BS 6 ARP.REQ.ETYPE .DA /S.ETH.ETHERTYPE.ARP @@ -235,7 +241,7 @@ ARP.REQ.SPA .BS 4 ARP.REQ.THA .BS 6 ARP.REQ.TPA .BS 4 *-------------------------------------- -ARP.REP .DA S.ARP-2 Frame size +ARP.REP .DA S.ARP Frame size ARP.REP.DSTMAC .BS 6 ARP.REP.SRCMAC .BS 6 ARP.REP.ETYPE .DA /S.ETH.ETHERTYPE.ARP @@ -275,7 +281,6 @@ FRM.QUEUE.Retry .BS K.FRMQUEUE.SIZE *-------------------------------------- RefCount .DA #0 hSocketTable .BS 1 -DevFlags .BS 1 DYNPORT.LAST .DA K.DYNPORT.START hDNSSocket1 .BS 1 hDNSSocket2 .BS 1 @@ -301,6 +306,8 @@ FD.SSOCK .BS 1 S.FD.HANDLER .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 index cce6a372..a50b470c 100644 --- a/SBIN/TCPIPD.S.CFG.txt +++ b/SBIN/TCPIPD.S.CFG.txt @@ -143,7 +143,7 @@ CFG.Read.LoadFile stz CFG.hCfgFile stz CFG.hCfgPath - >SYSCALL ExpandStr.YA + >SYSCALL ExpandStr bcs .9 stx CFG.hCfgPath diff --git a/SBIN/TCPIPD.S.txt b/SBIN/TCPIPD.S.txt index 2c776580..c9c2fa92 100644 --- a/SBIN/TCPIPD.S.txt +++ b/SBIN/TCPIPD.S.txt @@ -8,6 +8,7 @@ AUTO 4,1 *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I + .INB /A2OSX.BUILD/INC/ETH.I .INB /A2OSX.BUILD/INC/LIBTCPIP.I .INB /A2OSX.BUILD/INC/MLI.ERR.I *-------------------------------------- @@ -87,7 +88,7 @@ CS.INIT >LDYA L.LIBTCPIP .99 rts *-------------------------------------- CS.INIT.DEV >LDYA L.DEVNAME - >SYSCALL GetDevByName.YA + >SYSCALL GetDevByName bcc .1 inc DEVNAME+3 lda DEVNAME+3 @@ -108,14 +109,14 @@ CS.INIT.DEV >LDYA L.DEVNAME >LDYA L.MSG.DEV.OK >SYSCALL printf - >PUSHB.G hDev - >PUSHBI DEVMGR.OPEN >PUSHWI 0 + >PUSHBI IOCTL.OPEN + >LDA.G hDev >SYSCALL IOCTL bcs .9 >LDA.G hDev - >SYSCALL GetDevStatus + sdfsdfsdfsf >SYSCALL GetDevStatus bcs .9 >STYA ZPDevStatusPtr @@ -150,9 +151,9 @@ CS.DOEVENT lda (pEvent) CS.QUIT >LDA.G hDev beq .1 - >PUSHA - >PUSHBI DEVMGR.CLOSE >PUSHWI 0 + >PUSHBI IOCTL.CLOSE + >LDA.G hDev >SYSCALL IOCTL .1 lda hLIBTCPIP diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 79fb2b34..0f805b35 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -627,11 +627,10 @@ BCDBUF .EQ ARG * # SScanF * Read formatted data from string * ## C -* `int sscanf ( const char * s, const char * format, ...);` +* `int sscanf ( const char * s, const char * format, ... );` * ## ASM * **In:** * `>PUSHBI Argument Byte count` -* `>PUSHWI format` * + %i : short int * + %d : byte * + %I : int @@ -640,6 +639,10 @@ BCDBUF .EQ ARG * + %U : dword * + %h : HEX byte * + %H : HEX word +* `>PUSHW ptr` +* `...` +* `>PUSHBI bytecount` +* `>PUSHWI format` * `>LDYA s` * **Out:** * Y,A = Number of arguments filled. @@ -647,6 +650,7 @@ BCDBUF .EQ ARG K.SScanF >STYA ZPPtr2 String to Scan >PULLW ZPPtr1 format >PULLB K.SScanF.ByteCnt + stz K.SScanF.ByteIdx .1 lda (ZPPtr1) End Of format? @@ -694,7 +698,7 @@ K.SScanF >STYA ZPPtr2 String to Scan .8 lda pStack clc - adc K.SScanF.ByteCnt + adc K.SScanF.ByteCnt ... sta pStack CC .99 rts *--------------------------------------