A2osX/LIB/LIBETALK.S.AARP.txt
2023-10-18 07:41:12 +02:00

398 lines
7.2 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.

NEW
AUTO 3,1
*/--------------------------------------
* # AARP.Clear
* Clear AARP Cache
* ## ASM
* ## RETURN VALUE
*\--------------------------------------
AARP.Clear ldx #K.AARPCACHE.SIZE*S.AARPCACHE
.1 stz AARP.CACHE-1,x
dex
bne .1
clc
rts
*/--------------------------------------
* # AARP.Query
* Query AARP Cache and returns HW address
* ## ASM
* PUSHW PTR to MAC (to fill)
* PUSHW PTR to ADDR
* ## RETURN VALUE
* CC: hit: MAC filled
* CS: missed
*\--------------------------------------
AARP.Query >PULLW ZPPtrADDR ADDR
>PULLW ZPPtrMAC MAC
ldy #3
.1 lda (ZPPtrADDR),y
sta AARP.TmpCache+S.AARPCACHE.ADDR,y
dey
bpl .1
jsr AARP.QUERY.I
bcs .9
ldy #5
.2 lda AARP.TmpCache+S.AARPCACHE.MAC,y
sta (ZPPtrMAC),y
dey
bpl .2
clc
.9 rts
*/--------------------------------------
* # AARP.Add
* Add a static AARP cache record
* ## ASM
* PUSHW PTR to MAC
* PUSHW PTR to IP
*\--------------------------------------
AARP.Add >PULLW ZPPtrADDR ADDR
>PULLW ZPPtrMAC MAC
stz AARP.TmpCache+S.AARPCACHE.TTL
stz AARP.TmpCache+S.AARPCACHE.TTL+1
ldy #3
.1 lda (ZPPtrADDR),y
sta AARP.TmpCache+S.AARPCACHE.ADDR,y
dey
bpl .1
ldy #5
.2 lda (ZPPtrMAC),y
sta AARP.TmpCache+S.AARPCACHE.MAC,y
dey
bpl .2
lda #S.AARPCACHE.S.RESOLVED+S.AARPCACHE.S.STATIC
AARP.ADD.I sta AARP.TmpCache
jsr AARP.FIND.BY.ADDR
bcc .1
jsr AARP.FIND.FREE
.1 ldy #S.AARPCACHE-1
.2 lda AARP.TmpCache,y
sta (ZPCachePtr),y
dey
bpl .2
clc
rts
*/--------------------------------------
* # AARP.GetCache
* Return a Ptr to AARP Cache Table
* ## ASM
* ## RETURN VALUE
* Y,A = PTR to AARP.CACHE
*\--------------------------------------
AARP.GetCache >LDYA L.AARP.CACHE
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
AARP.AddFromFrameInPtr
ldy #S.DDP2.SRC.NET
lda (ZPFrameInPtr),y
sta AARP.TmpCache+S.AARPCACHE.ADDR+1,x
iny
lda (ZPFrameInPtr),y
sta AARP.TmpCache+S.AARPCACHE.ADDR+2,x
iny
iny
lda (ZPFrameInPtr),y
sta AARP.TmpCache+S.AARPCACHE.ADDR+3,x
ldy #S.ETH.SRCMAC+5
ldx #5
.2 lda (ZPFrameInPtr),y
sta AARP.TmpCache+S.AARPCACHE.MAC,x
dey
dex
bpl .2
lda #K.AARP.TTL
sta AARP.TmpCache+S.AARPCACHE.TTL
lda /K.AARP.TTL
sta AARP.TmpCache+S.AARPCACHE.TTL+1
lda #S.AARPCACHE.S.RESOLVED
jmp AARP.ADD.I
*--------------------------------------
AARP.IN ldy #S.AARP.TPA+3
lda (ZPFrameInPtr),y
cmp ETKCFG+S.ETKCFG.NodID
bne AARP.IN.EXIT
dey
lda (ZPFrameInPtr),y
cmp ETKCFG+S.ETKCFG.NetID
bne AARP.IN.EXIT
dey
lda (ZPFrameInPtr),y
cmp ETKCFG+S.ETKCFG.NetID+1
bne AARP.IN.EXIT
ldy #S.AARP.OPERATION+1 HI byte
lda (ZPFrameInPtr),y
cmp #S.AARP.OPERATION.REQ
beq AARP.IN.REQ
cmp #S.AARP.OPERATION.REP
beq AARP.IN.REP
AARP.IN.EXIT lda hFrameIn
beq .8
stz hFrameIn
>SYSCALL2 FreeMem
.8 clc
rts
*--------------------------------------
AARP.IN.REQ ldy #S.AARP.SPA+3
ldx #3
.1 lda (ZPFrameInPtr),y
sta AARP.REP.TPA,x
dey
dex
bpl .1
ldy #S.AARP.SHA+5
ldx #5
.2 lda (ZPFrameInPtr),y
sta AARP.REP.DSTMAC,x
sta AARP.REP.THA,x
dey
dex
bpl .2
lda ETKCFG+S.ETKCFG.NetID+1
sta AARP.REP.SPA+1
lda ETKCFG+S.ETKCFG.NetID
sta AARP.REP.SPA+2
lda ETKCFG+S.ETKCFG.NodID
sta AARP.REP.SPA+3
>LDYA L.AARP.REP
jsr AARP.Send
bra AARP.IN.EXIT
*--------------------------------------
AARP.IN.REP lda #K.AARP.TTL
sta AARP.TmpCache+S.AARPCACHE.TTL
lda /K.AARP.TTL
sta AARP.TmpCache+S.AARPCACHE.TTL+1
ldy #S.AARP.SPA+3
ldx #3
.1 lda (ZPFrameInPtr),y
sta AARP.TmpCache+S.AARPCACHE.ADDR,x
dey
dex
bpl .1
ldy #S.AARP.SHA+5
ldx #5
.2 lda (ZPFrameInPtr),y
sta AARP.TmpCache+S.AARPCACHE.MAC,x
dey
dex
bpl .2
lda #S.AARPCACHE.S.RESOLVED
jsr AARP.ADD.I
jmp AARP.IN.EXIT
*--------------------------------------
AARP.QUERY.I jsr AARP.FIND.BY.ADDR
bcs .3 send an AARP request
lda (ZPCachePtr) get status...
bpl .9 Pending...
ldy #S.AARPCACHE.MAC
.2 lda (ZPCachePtr),y
sta AARP.TmpCache,y
iny
cpy #S.AARPCACHE.MAC+6
bne .2
ldy #S.AARPCACHE.TTL
lda #K.AARP.TTL
sta (ZPCachePtr),y
iny
lda /K.AARP.TTL
sta (ZPCachePtr),y
clc
rts
.3 ldx #3
.4 lda AARP.TmpCache+S.AARPCACHE.ADDR,x
sta AARP.REQ.TPA,x
dex
bpl .4
>LDYA L.AARP.REQ
jsr AARP.Send
bcs .99
lda #K.AARP.PENDING.TTL
sta AARP.TmpCache+S.AARPCACHE.TTL
stz AARP.TmpCache+S.AARPCACHE.TTL+1
lda #S.AARPCACHE.S.PENDING
jsr AARP.ADD.I
.9 lda #ERR.AARP.PENDING
sec
.99 rts
*--------------------------------------
AARP.FIND.BY.ADDR
>LDYA L.AARP.CACHE
>STYA ZPCachePtr
lda #K.AARPCACHE.SIZE
sta TmpOffset
.1 lda (ZPCachePtr)
beq .3
ldx #3
ldy #S.AARPCACHE.ADDR+3
.2 lda AARP.TmpCache+S.AARPCACHE.ADDR,x
cmp (ZPCachePtr),y
bne .3
dey
dex
bpl .2
clc
rts
.3 lda ZPCachePtr
clc
adc #S.AARPCACHE
sta ZPCachePtr
bcc .8
inc ZPCachePtr+1
.8 dec TmpOffset
bne .1
sec
rts
*--------------------------------------
AARP.FIND.FREE >LDYA L.AARP.CACHE
>STYA ZPCachePtr
lda #$ff
sta TmpDWord
sta TmpDWord+1
ldx #K.AARPCACHE.SIZE
.1 lda (ZPCachePtr)
beq .8
bpl .6
ldy #S.AARPCACHE.TTL
lda (ZPCachePtr),y
sec
sbc TmpDWord
iny
lda (ZPCachePtr),y
sbc TmpDWord+1
bcc .6
lda (ZPCachePtr),y
sta TmpDWord+1
dey
lda (ZPCachePtr),y
sta TmpDWord
>LDYA ZPCachePtr
>STYA ZPTmpPtr1 save lowest TTL slot ...
.6 lda ZPCachePtr
clc
adc #S.AARPCACHE
sta ZPCachePtr
bcc .7
inc ZPCachePtr+1
.7 dex
bne .1
>LDYA ZPTmpPtr1
>STYA ZPCachePtr
lda #0
sta (ZPCachePtr)
.8 clc
rts
*--------------------------------------
AARP.EXPIRE rts
>LDYA L.AARP.CACHE
>STYA ZPCachePtr
ldx #K.AARPCACHE.SIZE
.1 lda (ZPCachePtr)
beq .2
and #S.AARPCACHE.S.STATIC
bne .2
ldy #S.AARPCACHE.TTL
sec
lda (ZPCachePtr),y
sbc #1
sta (ZPCachePtr),y
iny
lda (ZPCachePtr),y
sbc #0
sta (ZPCachePtr),y
bcs .2
lda #0
sta (ZPCachePtr)
.2 lda ZPCachePtr
clc
adc #S.AARPCACHE
sta ZPCachePtr
bcc .3
inc ZPCachePtr+1
.3 dex
bne .1
rts
*--------------------------------------
AARP.Send >STYA IOCTL+S.IOCTL.BUFPTR
>LDYAI S.AARP
>STYA IOCTL+S.IOCTL.BYTECNT
jmp FRM.Send.IOCTL
*--------------------------------------
MAN
SAVE usr/src/lib/libetalk.s.aarp
LOAD usr/src/lib/libetalk.s
ASM