A2osX/SBIN/DHCPCLNT.S.txt
2015-11-22 23:30:06 +01:00

506 lines
9.6 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
NEW
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/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
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.LIBSTR .DA LIBSTR
L.LIBTCPIP .DA LIBTCPIP
L.IPCFG .DA IPCFG
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBSTR
>SYSCALL SYS.LoadLibYA
sta hLIBSTR
>LDYA L.LIBTCPIP
>SYSCALL SYS.LoadLibYA
sta hLIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
bcs .9
>STYA ZPPtr1
ldy #S.IPCFG
.1 dey
lda (ZPPtr1),y
sta IPCFG,y
tya
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
ldy #S.IPCFG.MAC+5
ldx #5
.2 lda IPCFG,y
sta FRAME.DISC.CHADDR,x
sta FRAME.REQ.CHADDR,x
dey
dex
bpl .2
lda #20
sta TimeOut
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
.9 rts
*--------------------------------------
CS.RUN
CS.RUN.DISC jsr SendDHCPDiscFrame
bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SDISC
sta IPCFG
CS.RUN.OFFER >SYSCALL SYS.Sleep
lda IPCFG
and #S.IPCFG.STATUS.ROFFER
bne CS.RUN.REQ
lda TimeOut
bne CS.RUN.OFFER
lda #1
bra CS.RUN.KO
CS.RUN.REQ 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
lda TimeOut
bne CS.RUN.RACK
lda #2
bra CS.RUN.KO
CS.RUN.OK lda #S.IPCFG.STATUS.OK
sta IPCFG
>PUSHW L.IPCFG
>LIBCALL hLIBTCPIP,LIBTCPIP.SET.IPCFG
lda #0 Leave with NO ERROR
sec
rts
CS.RUN.KO sec
rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
and #S.EVT.F.TIMER is it a TIMER event?
beq .1 no....
lda TimeOut
beq .9
dec TimeOut
bra .9 do not discard TIMER event
.1 lda (pEvent)
and #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
ldy #S.EVT.DATAW1 Get Frame Len
lda (pEvent),y
sta ZPFrameLen1
iny
lda (pEvent),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
lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
* SendDHCPDiscFrame
* In:
* Out:
*--------------------------------------
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
>LDYAI S.UDP+FRAME.DISC.LEN
>PUSHYA
>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.DNS
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
* In:
* Out:
*--------------------------------------
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
>LDYAI S.UDP+FRAME.REQ.LEN
>PUSHYA
>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
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
*--------------------------------------
FRAME.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS
FRAME.DISC.XID .BS 4
FRAME.DISC.SECS .HS 0000
FRAME.DISC.FLAGS .HS 0000
FRAME.DISC.CIADDR .HS 00000000
FRAME.DISC.YIADDR .HS 00000000
FRAME.DISC.SIADDR .HS 00000000
FRAME.DISC.GIADDR .HS 00000000
FRAME.DISC.CHADDR .HS 00000000.00000000.00000000.00000000
FRAME.DISC.SNAME .BS 64
FRAME.DISC.FILE .BS 128
FRAME.DISC.COOKIE .HS 63825363
FRAME.DISC.OPT .HS 3501
.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
FRAME.REQ.SECS .HS 0000
FRAME.REQ.FLAGS .HS 0000
FRAME.REQ.CIADDR .HS 00000000
FRAME.REQ.YIADDR .HS 00000000
FRAME.REQ.SIADDR .HS 00000000
FRAME.REQ.GIADDR .HS 00000000
FRAME.REQ.CHADDR .HS 00000000.00000000.00000000.00000000
FRAME.REQ.SNAME .BS 64
FRAME.REQ.FILE .BS 128
FRAME.REQ.COOKIE .HS 63825363
FRAME.REQ.OPT .HS 3501
.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
*--------------------------------------
hLIBSTR .BS 1
hLIBTCPIP .BS 1
TimeOut .BS 1
IPCFG .BS S.IPCFG
*--------------------------------------
DS.START
DS.END
*--------------------------------------
MAN
SAVE SBIN/DHCPCLNT.S
ASM