NEW PREFIX /A2OSX.BUILD 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 rts .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.FillSKT.TemplateSrcDstIPP ldy #S.TCPUDP.SRCPORT lda (ZPFrameInPtr),y sta SKT.Template+S.SOCKET.REM.PORT+1 iny lda (ZPFrameInPtr),y sta SKT.Template+S.SOCKET.REM.PORT iny #S.TCPUDP.DSTPORT lda (ZPFrameInPtr),y sta SKT.Template+S.SOCKET.LOC.PORT+1 iny lda (ZPFrameInPtr),y sta SKT.Template+S.SOCKET.LOC.PORT *-------------------------------------- IP.FillSKT.TemplateSrcDstIP ldy #S.IP.SRC+3 ldx #3 .1 lda (ZPFrameInPtr),y sta SKT.Template+S.SOCKET.REM.ADDR,x dey dex bpl .1 ldy #S.IP.DST+3 ldx #3 .2 lda (ZPFrameInPtr),y sta SKT.Template+S.SOCKET.LOC.ADDR,x dey dex bpl .2 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 /A2OSX.SRC/LIB/LIBTCPIP.S.IP LOAD /A2OSX.SRC/LIB/LIBTCPIP.S ASM