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