NEW AUTO 3,1 .OP 65C02 .OR $2000 *-------------------------------------- .DO U2AI=1 .TF DRV/UTHER2.AI.DRV .ELSE .TF DRV/UTHERNET2.DRV .FIN *-------------------------------------- ZPArgPtr .EQ ZPDRV *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp Dev.Detect cld,jmp abs=DRV .DA #$61 6502,Level 1 (65c02) .DA #1 DRV Layout Version 1 .DA 0 .DA CS.END-CS.START 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.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 puts ldx #$70+$88 ldy #7 .1 lda A2osX.S,y IO based detection, avoid scanning in Disk Controller IO!!!! bne .2 lda #W5100.MR.RST sta W5100.MR,x lda #0 .10 dec give some time.... bne .10 lda #W5100.MR.AI+W5100.MR.IND sta W5100.MR,x pha pla lda W5100.MR,x cmp #W5100.MR.AI+W5100.MR.IND bne .2 >AR.SELECT RTR lda W5100.DR,x Get RTR HI cmp /2000 bne .2 lda W5100.DR,x Get RTR LO cmp #2000 beq .3 .2 dec FD.DEV.NAME+3 txa sec sbc #$10 tax dey bne .1 >LDYA L.MSG.DETECT.KO >SYSCALL puts lda #MLI.E.NODEV sec rts .3 stx DEVSLOTx0 lda #A2osX.S.NIC sta A2osX.S,y jsr Dev.ParseArgs bcs .9 .8 >PUSHW L.FD.DEV.NAME >PUSHBI 2 >LDYA L.MSG.DETECT.OK >SYSCALL printf >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 >PUSHW L.FD.DEV.NAME >LDYA L.FD.DEV >SYSCALL MKDEV .9 rts *-------------------------------------- Dev.ParseArgs >LDYA ARGS >STYA ZPArgPTR lda (ZPArgPTR) bne .1 lda A2osX.RANDOM16 eor A2osX.TIMER16 sta DCB+S.DCB.NIC.MAC+3 eor A2osX.RANDOM16+1 sta DCB+S.DCB.NIC.MAC+4 eor A2osX.TIMER16+1 sta DCB+S.DCB.NIC.MAC+5 clc rts .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 #E.SYN sec .8 rts *-------------------------------------- CS.END ARGS .BS 2 .DO U2AI=1 MSG.DETECT .AZ "UtherNet2/W5100 Driver (ARP/IP Offload)." .ELSE MSG.DETECT .AZ "UtherNet2/W5100 Driver." .FIN MSG.DETECT.OK .AZ "UtherNet2/W5100 Installed As Device : %s\r\n" MSG.DETECT.KO .AZ "Hardware Not Found." SSCANF.MAC .AZ "%h:%h:%h:%h:%h:%h" *-------------------------------------- FD.DEV .DA #S.FD.T.CDEV .DA #0 HANDLER .DA #0 BUSID .DA #0 DEVID .DA 0 BUSPTR .BS 2 DRVPTR .DA 0 DCBPTR .DA 0 BUFPTR FD.DEV.NAME .AZ "ETH7" *-------------------------------------- * Driver Code *-------------------------------------- ZPIOCTL .EQ ZPDRV ZPBufPtr .EQ ZPDRV+2 Counter .EQ ZPDRV+4 Offset .EQ ZPDRV+6 RXTX.Size .EQ ZPDRV+8 .DO U2AI=1 RX.IP .EQ ZPDRV+10 .FIN *-------------------------------------- DRV.CS.START cld jmp (.1,x) .1 .DA STATUS .DA A2osX.BADCALL .DA A2osX.BADCALL .DA A2osX.BADCALL .DO U2AI=1 .DA CONTROL .ELSE .DA A2osX.BADCALL .FIN .DA A2osX.BADCALL .DA OPEN .DA CLOSE .DA READ .DA WRITE .DA 0 end or relocation *-------------------------------------- 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 .1 ldy #S.IOCTL.BUFPTR lda (ZPIOCTL),y sta .3+1 iny lda (ZPIOCTL),y sta .3+2 ldx #S.DCB.NIC-1 .2 lda DCB,x .3 sta $ffff,x SELF MODIFIED dex bpl .2 clc rts STATUS.9 lda #MLI.E.BADCTL sec rts *-------------------------------------- .DO U2AI=1 CONTROL >STYA ZPIOCTL ldy #S.IOCTL.CTRLCODE lda (ZPIOCTL),y cmp #S.IOCTL.CTRLCODE.SETDCB bne STATUS.9 .1 ldy #S.IOCTL.BUFPTR lda (ZPIOCTL),y sta .2+1 iny lda (ZPIOCTL),y sta .2+2 ldx #S.DCB.NIC-1 .2 lda $ffff,x SELF MODIFIED sta DCB,x dex bpl .2 .FIN *-------------------------------------- OPEN lda #S.DIB.S.OPENED bit DIB+S.DIB.S beq .10 lda #MLI.E.OPEN sec rts .10 jsr CLOSE * ldx DEVSLOTx0 Done by CLOSE lda #W5100.MR.AI+W5100.MR.IND sta W5100.MR,x >AR.SELECT SHAR ldy #0 .1 lda DCB+S.DCB.NIC.MAC,y sta W5100.DR,x iny cpy #6 bne .1 >AR.SELECT RMSR lda #3 8k,0k,0k,0k sta W5100.DR,x ...for Socket RX Buffers sta W5100.DR,x ...for Socket TX Buffers >AR.SELECT S0.MR .DO U2AI=1 lda #W5100.AR.S0.MR.IPRAW+W5100.AR.S0.MR.MF .ELSE lda #W5100.AR.S0.MR.MACRAW+W5100.AR.S0.MR.MF .FIN sta W5100.DR,x .DO U2AI=1 >AR.SELECT S0.TOS stz W5100.DR,x * >AR.SELECT S0.TTL lda #K.IP.TTL sta W5100.DR,x >AR.SELECT GAR ldy #0 .2 lda DCB+S.DCB.NIC.GW,y sta W5100.DR,x iny cpy #4 bne .2 * >AR.SELECT SUBR Implicit, next to GAR ldy #0 .3 lda DCB+S.DCB.NIC.MASK,y sta W5100.DR,x iny cpy #4 bne .3 >AR.SELECT SIPR ldy #0 .4 lda DCB+S.DCB.NIC.IP,y sta W5100.DR,x iny cpy #4 bne .4 .FIN >AR.SELECT S0.CR lda #W5100.AR.S0.CR.OPEN sta W5100.DR,x clc rts *-------------------------------------- CLOSE ldx DEVSLOTx0 lda #W5100.MR.RST sta W5100.MR,x lda $C019 we can use VBL as we are not on //c .1 eor $C019 bpl .1 lda $C019 .2 eor $C019 bpl .2 clc rts *-------------------------------------- READ php sei >STYA ZPIOCTL ldx DEVSLOTx0 >AR.SELECT S0.RX.RSR lda W5100.DR,x get the received size HI ora W5100.DR,x LO bne .1 lda #MLI.E.EOF .9 plp sec rts .1 >AR.SELECT S0.RX.RD lda W5100.DR,x get the received ptr HI sta offset+1 ldy W5100.DR,x get the received ptr LO sty offset and /RXTX.MASK ora /RX.BASE sta W5100.AR,x tya sta W5100.AR+1,x .DO U2AI=1 ldy #0 .10 lda W5100.DR,x sta RX.IP,y iny cpy #4 bne .10 ldy W5100.DR,x get RX.Size HI sty RXTX.Size+1 lda W5100.DR,x get RX.Size LO sta RXTX.Size clc adc #S.IP pha tya adc /S.IP ply .ELSE lda W5100.DR,x get RX.Size HI sta RXTX.Size+1 ldy W5100.DR,x get RX.Size LO sty RXTX.Size .FIN >SYSCALL getmem bcs .9 >STYA ZPBufPtr stx .8+1 phy ldy #S.IOCTL.BUFPTR+1 sta (ZPIOCTL),y dey pla sta (ZPIOCTL),y ldy #S.IOCTL.BYTECNT .DO U2AI=1 lda RXTX.Size sta (ZPIOCTL),y eor #$ff sta Counter eor #$ff clc adc #6 Total Size : Add 6 bytes for IPRAW sta RXTX.Size iny lda RXTX.Size+1 eor #$ff sta Counter+1 eor #$ff adc #0 sta RXTX.Size+1 .ELSE lda RXTX.Size sec sbc #2 Header Size : strip 2 bytes for MACRAW sta (ZPIOCTL),y eor #$ff sta Counter iny lda RXTX.Size+1 sbc #0 sta (ZPIOCTL),y eor #$ff sta Counter+1 .FIN .DO U2AI=1 ldx #3 ldy #S.IP.SRC+3 .11 lda RX.IP,x sta (ZPBufPtr),y dey dex bpl .11 ldy #S.IP .ELSE ldy #0 .FIN ldx DEVSLOTx0 .2 inc Counter bne .3 inc Counter+1 beq .4 .3 lda W5100.DR,x sta (ZPBufPtr),y iny bne .2 inc ZPBufPtr+1 bne .2 .4 >AR.SELECT S0.RX.RD lda Offset clc adc RXTX.Size pha save LO lda Offset+1 adc RXTX.Size+1 sta W5100.DR,x write HI pla sta W5100.DR,x write LO >AR.SELECT S0.CR lda #W5100.AR.S0.CR.RCVD sta W5100.DR,x .8 lda #$ff SELF MODIFIED hMem plp clc rts *-------------------------------------- WRITE php sei >STYA ZPIOCTL ldy #S.IOCTL.BYTECNT lda (ZPIOCTL),y .DO U2AI=1 sec sbc #S.IP .FIN sta RXTX.Size eor #$ff sta Counter iny lda (ZPIOCTL),y .DO U2AI=1 sbc /S.IP .FIN sta RXTX.Size+1 eor #$ff sta Counter+1 ldx DEVSLOTx0 >AR.SELECT S0.TX.FSR lda W5100.DR,x get send size HI ldy W5100.DR,x LO cpy RXTX.Size sbc RXTX.Size+1 bcs WRITE.1 lda #MLI.E.EOF plp sec rts WRITE.1 ldy #S.IOCTL.BUFPTR lda (ZPIOCTL),y sta ZPBufPtr iny lda (ZPIOCTL),y sta ZPBufPtr+1 .DO U2AI=1 >AR.SELECT S0.DIPR ldy #S.IP.DST .1 lda (ZPBufPtr),y sta W5100.DR,x iny cpy #S.IP.DST+4 bne .1 >AR.SELECT S0.PROTO ldy #S.IP.PROTOCOL lda (ZPBufPtr),y sta W5100.DR,x .ELSE ldy #S.ETH.SRCMAC+5 ldx #5 .1 lda DCB+S.DCB.NIC.MAC,x sta (ZPBufPtr),y dey dex bpl .1 ldx DEVSLOTx0 .FIN >AR.SELECT S0.TX.WR lda W5100.DR,x Get HI ldy W5100.DR,x Get LO and /RXTX.MASK ora /TX.BASE sta W5100.AR,x Write HI sta Offset+1 tya sta W5100.AR+1,x Write LO sta Offset .DO U2AI=1 ldy #S.IP .ELSE ldy #0 .FIN .2 inc Counter bne .3 inc Counter+1 beq .8 .3 lda (ZPBufPtr),y sta W5100.DR,x iny bne .2 inc ZPBufPtr+1 bne .2 .8 >AR.SELECT S0.TX.WR lda Offset clc adc RXTX.Size pha save LO lda Offset+1 adc RXTX.Size+1 sta W5100.DR,x write HI pla sta W5100.DR,x write LO >AR.SELECT S0.CR lda #W5100.AR.S0.CR.SEND sta W5100.DR,x plp clc rts *-------------------------------------- DRV.CS.END DEVSLOTx0 .BS 1 *-------------------------------------- DIB .DA #0 .DA #0,#0,#0 size >PSTR "UtherNetII/W5100" .DA #S.DIB.T.NIC .BS 1 Subtype .DA K.VER Version *-------------------------------------- DCB .DA #S.DCB.T.NIC .DO U2AI=1 .DA #S.DCB.NIC.FLAGS.ARPOFFLOAD+S.DCB.NIC.FLAGS.IPOFFLOAD .ELSE .DA #0 FLAGS .FIN .DA #S.DCB.NIC.LINK.OK+S.DCB.NIC.LINK.FD .DA #S.DCB.NIC.SPEED.100 .HS 0008DC123456 MAC .DA #0,#0,#0,#0 IP .DA #255,#255,#255,#255 MASK .DA #0,#0,#0,#0 GW *-------------------------------------- DRV.END MAN SAVE USR/SRC/DRV/X.U2.DRV.S LOAD USR/SRC/DRV/UTHER2.AI.DRV.S ASM