NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF sbin/networkd *-------------------------------------- LIB.MAX .EQ 4 DBG .EQ 0 *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/mli.i .INB inc/mli.e.i .INB inc/nic.i .INB inc/eth.i .INB inc/lib.net.i *-------------------------------------- * Zero Page Segment, up to 32 bytes *-------------------------------------- .DUMMY .OR ZPBIN ZS.START pBuf .BS 2 pNETCFG .BS 2 hEtcNetwork .BS 1 hBuf .BS 1 hFrameIn .BS 1 ZS.END .ED *-------------------------------------- * 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 Code Size (without Constants) .DA DS.END-DS.START Data SegmentSize .DO DBG=1 .DA #128 Stack Size .ELSE .DA #32 Stack Size .FIN .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.RUNNING .DA MSG.RUNNING L.MSG.DEV.OK .DA MSG.DEV.OK L.MSG.DEV.KO .DA MSG.DEV.KO L.MSG.LIB .DA MSG.LIB L.MSG.EXEC .DA MSG.EXEC L.MSG.OK .DA MSG.OK L.MSG.ERR .DA MSG.ERR L.DEVNAME .DA DEVNAME L.IOCTL .DA IOCTL L.ETCNETWORK .DA ETCNETWORK .DO DBG=1 L.MSG.DBG .DA MSG.DBG L.MSG.DBG.REJECT .DA MSG.DBG.REJECT .FIN .DA 0 *-------------------------------------- CS.INIT lda DevID bne .8 >LDYAI 64 >SYSCALL GetMem bcs .99 >STYA pBuf stx hBuf >STYA IOCTL+S.IOCTL.BUFPTR for CS.INIT.DEV jsr CS.INIT.DEV bcs .90 lda LibCnt .1 inc >SYSCALL ArgV bcs .2 jsr CS.INIT.LIB bcs .90 inc LibCnt lda LibCnt cmp #LIB.MAX bne .1 .2 jsr CS.INIT.CONF .90 php pha lda hBuf >SYSCALL FreeMem pla plp .99 rts .8 >LDYA L.MSG.RUNNING >SYSCALL PutS lda #0 sec rts *-------------------------------------- CS.INIT.DEV >PUSHW L.DEVNAME >PUSHBI 0 >SYSCALL Open bcc .8 inc DEVNAME+8 lda DEVNAME+8 cmp #'8' bne CS.INIT.DEV >LDYA L.MSG.DEV.KO >SYSCALL PutS lda #MLI.E.NODEV sec rts .8 sta DevID >PUSHW L.MSG.DEV.OK >PUSHW L.DEVNAME >PUSHBI 2 >SYSCALL PrintF lda #S.IOCTL.S.GETDCB sta IOCTL+S.IOCTL.S ldx #IOCTL.STATUS *-------------------------------------- CS.IOCTL lda DevID >PUSHA txa >PUSHA >PUSHW L.IOCTL >SYSCALL IOCTL CS.IOCTL.RTS rts *-------------------------------------- * pBuf = DCB.NIC *-------------------------------------- CS.INIT.LIB phy pha >PUSHW L.MSG.LIB pla pha >PUSHYA >PUSHBI 2 >SYSCALL PrintF pla ply >SYSCALL LoadLib jsr CS.RUN.CheckErr bcs CS.IOCTL.RTS ldy LibCnt sta hLIBs,y tay ldx #LIBNET.GETCFG jsr A2osX.LIBCALL bcs CS.IOCTL.RTS >STYA pNETCFG lda DevID ldy #S.NETCFG.DevID sta (pNETCFG),y ldy #S.DCB.NIC.FLAGS lda (pBuf),y ldy #S.NETCFG.DevFlags sta (pNETCFG),y ldx #6 ldy #S.DCB.NIC.MAC .2 lda (pBuf),y pha iny dex bne .2 ldx #6 ldy #S.NETCFG.MAC+5 .3 pla sta (pNETCFG),y dey dex bne .3 >PUSHW pNETCFG ldx LibCnt ldy hLIBs,x ldx #LIBNET.SETCFG jmp A2osX.LIBCALL *-------------------------------------- CS.INIT.CONF >PUSHW L.ETCNETWORK >PUSHBI O.RDONLY+O.TEXT >PUSHBI S.FI.T.TXT >PUSHWZ >SYSCALL FOpen bcs .9 sta hEtcNetwork .1 >PUSHB hEtcNetwork >PUSHW pBuf >PUSHWI 63 >SYSCALL FGetS bcs .8 >PUSHW L.MSG.EXEC >PUSHW pBuf >PUSHBI 2 >SYSCALL PrintF >PUSHW pBuf >PUSHBI 0 S.PS.F.HOLD >SYSCALL ExecL jsr CS.RUN.CheckErr >SLEEP bra .1 .8 lda hEtcNetwork >SYSCALL FClose * clc .9 rts *-------------------------------------- CS.RUN ldx #IOCTL.READ jsr CS.IOCTL bcs .8 No Frame sta hFrameIn .DO DBG=1 >SYSCALL GetMemPtr >STYA pBuf jsr CS.RUN.FILTER bcs .23 >PUSHW L.MSG.DBG ldy #0 .22 >PUSHB (pBuf),y iny cpy #54 bne .22 >PUSHBI 54 >SYSCALL PrintF .23 .FIN ldx #0 .1 ldy hLIBs,x beq .2 >PUSHW L.IOCTL lda hFrameIn phx ldx #LIBNET.INCOMING jsr A2osX.LIBCALL plx bcc CS.RUN inx bra .1 .2 .DO DBG=1 jsr CS.RUN.FILTER bcs .33 >LDYA L.MSG.DBG.REJECT >SYSCALL puts .33 .FIN lda hFrameIn >SYSCALL FreeMem jmp CS.RUN .8 clc rts *-------------------------------------- .DO DBG=1 CS.RUN.FILTER lda (pBuf) * cmp #$ff * beq .9 * ldy #S.ETH.EII.TYPE+1 * lda (pBuf),y * bne .9 clc rts .9 sec rts .FIN *-------------------------------------- CS.RUN.CheckErr pha bcs .1 >LDYA L.MSG.OK >SYSCALL PutS pla rts .1 >PUSHW L.MSG.ERR pla pha >PUSHA >PUSHBI 1 >SYSCALL PrintF pla sec rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 ldx #0 .1 ldy hLIBs,x beq .9 phx ldx #LIBNET.PULSE lda (pEvent) jsr A2osX.LIBCALL plx inx bra .1 .9 sec never discard TIME event rts *-------------------------------------- CS.QUIT ldx #0 .1 lda hLIBs,x beq .7 phx >SYSCALL UnloadLib plx inx bra .1 .7 lda DevID beq .8 ldx #IOCTL.CLOSE jsr CS.IOCTL .8 clc rts *-------------------------------------- CS.END *-------------------------------------- MSG.RUNNING .AZ "NETWORKD:Already loaded, exiting." MSG.DEV.KO .AZ "NETWORKD:No Device Found, exiting." MSG.DEV.OK .AZ "NETWORKD:Bound To Device : %s\r\n" MSG.LIB .AZ "NETWORKD:Loading %s..." MSG.EXEC .AZ "NETWORKD:Running %s..." *-------------------------------------- MSG.OK .AZ "[OK]" MSG.ERR .AZ "[%h]\r\n" *-------------------------------------- ETCNETWORK .AZ "${BOOT}etc/network" .DO DBG=1 MSG.DBG .AS "FRM ETH:%h%h%h%h%h%h.%h%h%h%h%h%h.%h%h\r\n" .AS " IP :%h%h.%h%h.%h%h.%h%h.%h [%d] (%h%h) %d.%d.%d.%d>%d.%d.%d.%d\r\n" .AZ " TCP:%D>%D %h%h%h%h %h%h%h%h %h %b [%h%h] (%h%h) %h%h\r\n" MSG.DBG.REJECT .AZ "Rejected" .FIN *-------------------------------------- DevID .BS 1 LibCnt .BS 1 hLIBs .BS LIB.MAX+1 for ending 0 if MAX libs DEVNAME .AZ "/dev/eth1" IOCTL .BS S.IOCTL *-------------------------------------- .DUMMY .OR 0 DS.START DS.END .ED *-------------------------------------- MAN SAVE usr/src/sbin/networkd.s ASM