Ultrix-3.1/sys/net/cksum.ed

/_in_ckad/-2,/_in_ckad/+2c
add r0,r2
adc r2
.
/_in_ckbu/c
/ 1's complement checksum routine.  assumes sum on entry is on logical even
/ byte boundary, even though entry address may be odd.
/
/ r2 - 1's complement sum
/ r3 - number of bytes
/ r4 - byte address
	clr     -(sp)                   /assume even start address
	bit     $1,r4
	beq     1f                      /if even starting address
	inc     (sp)
	clr     r0
	bisb    (r4)+,r0                /get byte at odd address
	add     r0,r2
	adc     r2
	swab    r2
	dec     r3                      /and adjust byte count
1:
	clr     r1                      /assume even byte count
	asr     r3                      /convert byte to word count
	adc     r1                      /set r1 if extra trailing odd byte
	tst     r3
	beq     4f                      /if no words left
2:
	add     (r4)+,r2                /add into checksum
	adc     r2
	sob     r3,2b                   /and process all of them
4:
	tst     r1                      /extra trailing byte?
	beq     3f                      /if not, exit
	clr     r0
	bisb    (r4)+,r0                /get that extra byte
	add     r0,r2                   /and include in the checksum
	adc     r2
3:
	tst     (sp)+
	beq     5f                      /if starting address not odd
	swab    r2
5:
.
w
q