A2osX/SBIN/DHCPCLNT.S.txt
2016-03-13 22:54:28 +01:00

567 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
LOMEM $C00
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/SBIN/DHCPCLNT
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBTCPIP.I
*--------------------------------------
TIMEOUT.MAX .EQ 4 4 sec.
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
ZPPtr1 .EQ ZPBIN+6
*--------------------------------------
* 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
.DA DS.END-DS.START Data Segment to Allocate
.DA 0
.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.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
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL SYS.LoadLibYA
sta hLIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
bcs .9
>STYA ZPPtr1
lda (ZPPtr1)
and #S.IPCFG.STATUS.OK
bne .99 Already Configured, exit
ldy #S.IPCFG.HDEV
lda (ZPPtr1),y
beq .98
ldy #0
.1 lda (ZPPtr1),y
sta IPCFG,y
iny
cpy #S.IPCFG
bne .1
>LDYA A2OSX.TIMER16
>STYA FRAME.DISC.XID
>STYA FRAME.REQ.XID
>LDYA A2OSX.RANDOM16
>STYA FRAME.DISC.XID+2
>STYA FRAME.REQ.XID+2
lda #0
sta IPCFG
ldx #5
.2 lda IPCFG+S.IPCFG.MAC,x
sta FRAME.DISC.CHADDR,x
sta FRAME.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 SYS.PSTROutYA
lda #0
sec
rts
*--------------------------------------
CS.RUN >LDYA L.MSG.CFG1
>SYSCALL SYS.PSTROutYA
CS.RUN.DISC jsr SendDHCPDiscFrame
bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SDISC
sta IPCFG
jsr Init.Timeout
CS.RUN.OFFER >SYSCALL SYS.Sleep
lda IPCFG
and #S.IPCFG.STATUS.ROFFER
bne CS.RUN.REQ
jsr Wait.Timeout
bcc CS.RUN.OFFER
lda #1
bra CS.RUN.KO
CS.RUN.REQ ldx #3
.1 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x
dex
bpl .1
>LDYA L.MSG.CFG2
>SYSCALL SYS.PSTROutYA
jsr SendDHCPReqFrame
bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SREQ
sta IPCFG
CS.RUN.RACK >SYSCALL SYS.Sleep
lda IPCFG
and #S.IPCFG.STATUS.RACK
bne CS.RUN.OK
jsr Wait.Timeout
bcc CS.RUN.RACK
lda #2
CS.RUN.KO pha
>PUSHA
>LDYA L.MSG.CFG.KO
>SYSCALL SYS.PSTROutYA
pla
sec
rts
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 SYS.PSTROutYA
lda #0 Leave with NO ERROR
sec
rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
bpl .1 is it a TIMER event?
asl One second ?
bpl .9
ldy #TimeOut
lda (pData),y
beq .9
dec
sta (pData),y
sec do not discard TIMER event
rts
.1 bit #S.EVT.F.NET
beq .9
ldy #S.IPCFG.HDEV
lda IPCFG,y
ldy #S.EVT.hDEV
cmp (pEvent),y
bne .9
ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
lda (ZPFrameBase1)
sta ZPFrameLen1
ldy #1
lda (ZPFrameBase1),y
sta ZPFrameLen1+1
lda IPCFG
and #S.IPCFG.STATUS.SDISC
beq .2
jsr CheckDHCPOfferFrame
bcs .9
lda #S.IPCFG.STATUS.ROFFER
sta IPCFG
clc
rts
.2 lda IPCFG
and #S.IPCFG.STATUS.SREQ
beq .9
jsr CheckDHCPAckFrame
bcs .9
lda #S.IPCFG.STATUS.RACK
sta IPCFG
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
SendDHCPDiscFrame
jsr NewDHCPFrame
bcs .9
phx
lda ZPFrameBase1
clc
adc #S.UDP
sta ZPPtr1
lda ZPFrameBase1+1
adc /S.UDP
sta ZPPtr1+1
ldy #FRAME.DISC.LEN
.1 dey
lda FRAME.DISC,y
sta (ZPPtr1),y
tya
bne .1
lda #S.UDP+FRAME.DISC.LEN-2
sta (ZPFrameBase1)
ldy #1
lda /S.UDP+FRAME.DISC.LEN-2
sta (ZPFrameBase1),y
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
pla
php
>SYSCALL SYS.FreeMemA
plp
.9 rts
*--------------------------------------
CheckDHCPOfferFrame
jsr CheckDHCPXID
bcs .9
>LDAXI S.DHCP.OPTIONS
jsr SetFramePtr1AX
ldy #2 DHCPOffer ?
lda (ZPFramePtr1),y
cmp #S.DHCP.OPTIONS.DHCPOffer
bne .9
ldy #S.DHCP.YIADDR+3
ldx #3
.1 lda (ZPFrameBase1),y
sta FRAME.REQ.OPT.REQIP,x
dey
dex
bpl .1
ldx #3
ldy #S.IPCFG.IP+3
.2 lda FRAME.REQ.OPT.REQIP,x
sta IPCFG,y
dey
dex
bpl .2
ldy #S.IP.SRC+3
ldx #3
.3 lda (ZPFrameBase1),y
sta FRAME.REQ.OPT.SVRIP,x
dey
dex
bpl .3
ldx #3
ldy #S.IPCFG.DHCPSRVR+3
.4 lda FRAME.REQ.OPT.SVRIP,x
sta IPCFG,y
dey
dex
bpl .4
.5 inc ZPFramePtr1 skip Option 53 (DHCPOffer:530102)
bne .6
inc ZPFramePtr1+1
.6 lda (ZPFramePtr1)
sec
adc ZPFramePtr1 add option len + 1
sta ZPFramePtr1
bcc .7
inc ZPFramePtr1+1
.7 lda (ZPFramePtr1)
cmp #S.DHCP.OPTIONS.END
beq .8
jsr GetDHCPOption
bra .5
.8 clc
rts
.9 sec
rts
*--------------------------------------
GetDHCPOption cmp #S.DHCP.OPTIONS.MASK
bne .1
ldy #S.IPCFG.MASK
bra GetDHCPOption.CopyIP
.1 cmp #S.DHCP.OPTIONS.GW
bne .2
ldy #S.IPCFG.GW
bra GetDHCPOption.CopyIP
.2 cmp #S.DHCP.OPTIONS.DNS
bne .3
ldy #S.IPCFG.DNS1
bra GetDHCPOption.CopyIP
.3 cmp #S.DHCP.OPTIONS.DOMAIN
bne .9
ldy #1
ldx #$FF
.4 iny
inx
lda (ZPFramePtr1),y
sta TmpBuffer256,x
bne .4
ldy #S.IPCFG.DOMAIN-1
ldx #$FF
.5 iny
inx
lda TmpBuffer256,x
sta IPCFG,y
bne .5
.9 rts
GetDHCPOption.CopyIP
phy
ldy #2
ldx #0
.1 lda (ZPFramePtr1),y
sta TmpBuffer256,x
iny
inx
cpx #4
bne .1
ply
ldx #0
.2 lda TmpBuffer256,x
sta IPCFG,y
iny
inx
cpx #4
bne .2
rts
*--------------------------------------
SendDHCPReqFrame
jsr NewDHCPFrame
bcs .9
phx
lda ZPFrameBase1
clc
adc #S.UDP
sta ZPPtr1
lda ZPFrameBase1+1
adc /S.UDP
sta ZPPtr1+1
ldy #FRAME.REQ.LEN
.1 dey
lda FRAME.REQ,y
sta (ZPPtr1),y
tya
bne .1
lda #S.UDP+FRAME.REQ.LEN-2
sta (ZPFrameBase1)
ldy #1
lda /S.UDP+FRAME.REQ.LEN-2
sta (ZPFrameBase1),y
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
pla
php
>SYSCALL SYS.FreeMemA
plp
.9 rts
*--------------------------------------
CheckDHCPAckFrame
jsr CheckDHCPXID
bcs .9
>LDAXI S.DHCP.OPTIONS
jsr SetFramePtr1AX
ldy #2 DHCPAck ?
lda (ZPFramePtr1),y
cmp #S.DHCP.OPTIONS.DHCPAck
bne .9
clc
rts
.9 sec
rts
*--------------------------------------
CheckDHCPXID ldy #S.DHCP.XID+3
ldx #3
.1 lda (ZPFrameBase1),y
cmp FRAME.DISC.XID,x same XID ?
bne .9
dey
dex
bpl .1
clc
rts
.9 sec
rts
*--------------------------------------
NewDHCPFrame >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME
bcs .9
>STYA ZPFrameBase1
ldy #S.UDP.SRCPORT
lda /UDP.PORT.DHCPC
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DHCPC
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DHCPS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DHCPS
sta (ZPFrameBase1),y
lda #255 S.IP.DST = 255.255.255.255
ldy #S.IP.DST
.1 sta (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
clc x = hMem
.9 rts
*--------------------------------------
SetFramePtr1AX clc
adc ZPFrameBase1
sta ZPFramePtr1
txa
adc ZPFrameBase1+1
sta ZPFramePtr1+1
rts
*--------------------------------------
Init.Timeout ldy #TimeOut
lda #TIMEOUT.MAX
sta (pData),y
rts
*--------------------------------------
Wait.TimeOut sec
ldy #TimeOut
lda (pData),y
beq .9
ldy #bCTRLC
lda (pData),y
bmi .9
clc
.9 rts
*--------------------------------------
CS.END
LIBTCPIP >PSTRING "libtcpip.o"
MSG.CFG1 >PSTRING "DHCPCLNT:Searching for DHCP servers...\n"
MSG.CFG2 >PSTRING "DHCPCLNT:Reply from DHCP Server at %d.%d.%d.%d, requesting...\n"
MSG.CFG.KO >PSTRING "DHCPCLNT:Time Out [%h].\n"
MSG.CFG.OK >PSTRING "DHCPCLNT:Success:[IP=%d.%d.%d.%d/%d.%d.%d.%d]\n"
MSG.CFG.ND >PSTRING "DHCPCLNT:No Device, exiting.\n"
MSG.CFG.NA >PSTRING "DHCPCLNT:TCPIP Already configured, exiting.\n"
hLIBTCPIP .BS 1
IPCFG .BS S.IPCFG
FRAME.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS
FRAME.DISC.XID .BS 4
.HS 0000 SECS
.HS 0000 FLAGS
.HS 00000000 CIADDR
FRAME.DISC.YIADDR .HS 00000000
.HS 00000000 SIADDR
.HS 00000000 GIADDR
FRAME.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
FRAME.DISC.LEN .EQ *-FRAME.DISC
FRAME.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS
FRAME.REQ.XID .BS 4
.HS 0000 SECS
.HS 0000 FLAGS
.HS 00000000 CIADDR
FRAME.REQ.YIADDR .HS 00000000
.HS 00000000 SIADDR
.HS 00000000 GIADDR
FRAME.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
FRAME.REQ.OPT.REQIP .BS 4
.HS 3604
FRAME.REQ.OPT.SVRIP .BS 4
.HS FF
FRAME.REQ.LEN .EQ *-FRAME.REQ
*--------------------------------------
DS.START
TimeOut .BS 1
bCTRLC .BS 1
DS.END
MAN
SAVE SBIN/DHCPCLNT.S
ASM