NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/SBIN/DHCPCLNT *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBTCPIP.I .INB /A2OSX.BUILD/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 0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #16 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.Socket .DA Socket 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 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.HDEV lda (ZPIPCfgPtr),y beq .98 ldy #S.IPCFG-1 .1 lda (ZPIPCfgPtr),y sta IPCFG,y dey bne .1 stz IPCFG 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 lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) clc .9 rts .98 >LDYA L.MSG.CFG.ND bra .90 .99 >LDYA L.MSG.CFG.NA .90 >SYSCALL printf lda #0 sec rts *-------------------------------------- CS.RUN >PUSHW L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcc .1 jmp CS.RUN.KO .1 txa ldy #hSocket sta (pData),y >LDYA L.MSG.CFG1 >SYSCALL printf jsr Init.Timeout CS.RUN.SDISC ldy #hSocket >PUSHB (pData),y >PUSHW L.DHCP.DISC >PUSHWI DHCP.DISC.LEN >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write 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 >LDYA L.MSG.CFG2 >SYSCALL printf ldy #hSocket >PUSHB (pData),y >PUSHW L.DHCP.REQ >PUSHWI DHCP.REQ.LEN >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write 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 >LDYA L.MSG.CFG.OK >SYSCALL printf lda #0 Leave with NO ERROR sec rts CS.RUN.KO pha >PUSHA >LDYA L.MSG.CFG.KO >SYSCALL printf pla sec rts *-------------------------------------- CS.RUN.SKT.RCVD ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ReadA bcs .9 ldy #hFrame sta (pData),y >SYSCALL GetMemPtr >STYA ZPFrameBase .9 rts *-------------------------------------- CS.RUN.DISCARD ldy #hFrame lda (pData),y >SYSCALL FreeMem 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 ldy #hSocket lda (pData),y beq .1 >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CloseA .1 lda hLIBTCPIP >SYSCALL UnloadLib 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 *-------------------------------------- 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.o" MSG.CFG1 .AZ "DHCPCLNT:Searching for DHCP servers...\r\n" 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.\r\n" MSG.CFG.NA .AZ "DHCPCLNT:TCPIP Already configured, exiting.\r\n" hLIBTCPIP .BS 1 IPCFG .BS S.IPCFG *-------------------------------------- Socket .DA #S.SOCKET.SOCK.DGRAM .BS 3 .HS 00.00.00.00 Socket.Src.Addr .DA UDP.PORT.DHCPC Socket.Src.Port .HS FF.FF.FF.FF Socket.Dst.Addr .DA UDP.PORT.DHCPS Socket.Dst.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 /A2OSX.SRC/SBIN/DHCPCLNT.S ASM