mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-31 23:09:33 +00:00
257 lines
4.4 KiB
Plaintext
257 lines
4.4 KiB
Plaintext
NEW
|
||
PREFIX
|
||
AUTO 4,1
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
IP.IN ldy #S.IP.PROTOCOL
|
||
lda (ZPFrameInPtr),y
|
||
cmp #S.IP.PROTOCOL.ICMP
|
||
bne .2
|
||
jmp ICMP.IN
|
||
|
||
.2 cmp #S.IP.PROTOCOL.UDP
|
||
bne .3
|
||
|
||
jmp UDP.IN
|
||
|
||
.3 cmp #S.IP.PROTOCOL.TCP
|
||
bne .9
|
||
jsr TCP.IN TCP will NOT discard FrameIn
|
||
|
||
.9 lda hFrameIn
|
||
beq .8
|
||
>SYSCALL FreeMem
|
||
|
||
.8 clc
|
||
rts
|
||
*--------------------------------------
|
||
IP.ComputeICMPChecksum
|
||
stz IP.CHECKSUM
|
||
stz IP.CHECKSUM+1
|
||
|
||
lda ZPFrameOutLen
|
||
sec
|
||
sbc #S.IP
|
||
eor #$ff
|
||
tax
|
||
|
||
lda ZPFrameOutLen+1
|
||
sbc /S.IP
|
||
eor #$ff
|
||
|
||
ldy #S.ICMP.CHECKSUM
|
||
|
||
clc
|
||
|
||
jmp IP.ComputeChecksum
|
||
*--------------------------------------
|
||
IP.ComputeUDPChecksum
|
||
clc
|
||
|
||
ldy #S.UDP.LENGTH+1
|
||
lda (ZPFrameOutPtr),y
|
||
|
||
adc #S.IP.PROTOCOL.UDP
|
||
sta IP.CHECKSUM+1
|
||
|
||
dey
|
||
lda (ZPFrameOutPtr),y
|
||
adc /S.IP.PROTOCOL.UDP (all zero)
|
||
sta IP.CHECKSUM
|
||
|
||
jsr IP.AddSrcDstIPToChecksum
|
||
|
||
ldy #S.UDP.LENGTH+1
|
||
lda (ZPFrameOutPtr),y
|
||
eor #$ff
|
||
tax
|
||
|
||
dey
|
||
lda (ZPFrameOutPtr),y
|
||
eor #$ff
|
||
|
||
ldy #S.UDP.CHECKSUM
|
||
bra IP.ComputeChecksum
|
||
*--------------------------------------
|
||
IP.ComputeTCPChecksum
|
||
lda ZPFrameOutLen
|
||
sec
|
||
sbc #S.IP
|
||
sta ZPDataInLen
|
||
|
||
lda ZPFrameOutLen+1
|
||
sbc /S.IP
|
||
sta ZPDataInLen+1
|
||
|
||
clc
|
||
|
||
* lda ZPDataInLen+1
|
||
* adc /S.IP.PROTOCOL.TCP (all zero)
|
||
sta IP.CHECKSUM
|
||
|
||
lda ZPDataInLen
|
||
adc #S.IP.PROTOCOL.TCP
|
||
sta IP.CHECKSUM+1
|
||
|
||
jsr IP.AddSrcDstIPToChecksum
|
||
|
||
lda ZPDataInLen
|
||
eor #$ff
|
||
tax
|
||
lda ZPDataInLen+1
|
||
eor #$ff
|
||
|
||
ldy #S.TCP.CHECKSUM
|
||
*--------------------------------------
|
||
* X,A = !ByteCount, Y = Offset in Frame
|
||
*--------------------------------------
|
||
IP.ComputeChecksum
|
||
phy Save Offset
|
||
pha Save !ByteCount.HI
|
||
|
||
lda #0 Reset Checksum
|
||
sta (ZPFrameOutPtr),y
|
||
iny
|
||
sta (ZPFrameOutPtr),y
|
||
|
||
>LDYA ZPFrameOutPtr
|
||
>STYA ZPTmpPtr1
|
||
|
||
ldy #S.IP
|
||
|
||
.1 inx
|
||
bne .11
|
||
pla
|
||
inc
|
||
beq .8
|
||
|
||
pha
|
||
|
||
.11 lda (ZPTmpPtr1),y
|
||
adc IP.CHECKSUM
|
||
sta IP.CHECKSUM
|
||
|
||
iny
|
||
bne .20
|
||
inc ZPTmpPtr1+1
|
||
|
||
.20 inx
|
||
bne .2
|
||
pla
|
||
inc
|
||
beq .7
|
||
|
||
pha
|
||
|
||
.2 lda (ZPTmpPtr1),y
|
||
|
||
adc IP.CHECKSUM+1
|
||
sta IP.CHECKSUM+1
|
||
|
||
iny
|
||
bne .1
|
||
inc ZPTmpPtr1+1
|
||
bra .1
|
||
|
||
.7 adc IP.CHECKSUM+1 A=0 from beq .7
|
||
sta IP.CHECKSUM+1
|
||
|
||
.8 ply
|
||
lda IP.CHECKSUM
|
||
adc #0 Don't forget to add last carry!!!
|
||
eor #$FF
|
||
sta (ZPFrameOutPtr),y
|
||
iny
|
||
lda IP.CHECKSUM+1
|
||
adc #0 Don't forget to add last carry!!!
|
||
eor #$FF
|
||
sta (ZPFrameOutPtr),y
|
||
rts
|
||
*--------------------------------------
|
||
IP.AddSrcDstIPToChecksum
|
||
ldy #S.IP.SRC
|
||
ldx #4 4 words for SRC & DST IP
|
||
|
||
.1 lda (ZPFrameOutPtr),y
|
||
adc IP.CHECKSUM
|
||
sta IP.CHECKSUM
|
||
iny
|
||
lda (ZPFrameOutPtr),y
|
||
adc IP.CHECKSUM+1
|
||
sta IP.CHECKSUM+1
|
||
iny
|
||
dex
|
||
bne .1
|
||
|
||
rts
|
||
*--------------------------------------
|
||
IP.SetDestMAC ldy #S.IP.DST
|
||
lda (ZPFrameOutPtr),y
|
||
iny
|
||
|
||
.1 and (ZPFrameOutPtr),y
|
||
iny
|
||
cpy #S.IP.DST+4
|
||
bne .1
|
||
|
||
cmp #$FF
|
||
bne .3 not a broadcast....
|
||
|
||
ldy #S.ETH.DSTMAC
|
||
|
||
.2 sta (ZPFrameOutPtr),y
|
||
iny
|
||
cpy #S.ETH.DSTMAC+6
|
||
bne .2
|
||
|
||
clc
|
||
rts
|
||
|
||
.3 ldy #S.IP.DST+3
|
||
ldx #3
|
||
|
||
.4 lda (ZPFrameOutPtr),y
|
||
eor IPCFG+S.IPCFG.IP,x
|
||
and IPCFG+S.IPCFG.MASK,x
|
||
bne .6
|
||
dey
|
||
dex
|
||
bpl .4
|
||
|
||
ldy #S.IP.DST+3 Same network, query ARP for dest IP
|
||
ldx #3
|
||
|
||
.5 lda (ZPFrameOutPtr),y
|
||
sta ARP.TmpCache+S.ARPCACHE.IP,x
|
||
dey
|
||
dex
|
||
bpl .5
|
||
bra .8
|
||
|
||
.6 ldx #3 Not Same network, query ARP for GW
|
||
|
||
.7 lda IPCFG+S.IPCFG.GW,x
|
||
sta ARP.TmpCache+S.ARPCACHE.IP,x
|
||
dex
|
||
bpl .7
|
||
|
||
.8 jsr ARP.QUERY.I
|
||
bcs .99
|
||
|
||
ldx #5
|
||
ldy #S.ETH.DSTMAC+5
|
||
|
||
.11 lda ARP.TmpCache+S.ARPCACHE.MAC,x
|
||
sta (ZPFrameOutPtr),y
|
||
dey
|
||
dex
|
||
bpl .11
|
||
|
||
clc
|
||
.99 rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE USR/SRC/LIB/LIBTCPIP.S.IP
|
||
LOAD USR/SRC/LIB/LIBTCPIP.S
|
||
ASM
|