|
|
1.1 ! root 1: /* cksum.s - cksum */ ! 2: ! 3: /* ! 4: *---------------------------------------------------------------------------- ! 5: * cksum -- compute ones complement of 16-bit ones complement checksum ! 6: *---------------------------------------------------------------------------- ! 7: * This routine computes the one's complement of the 16 bit two's complement ! 8: * checksum of an array of words, and is thus suitable for computing the ! 9: * checksum of various levels of the DARPA InterNet protocols. ! 10: * ! 11: * C Calling sequence: ! 12: * ! 13: * check = cksum(&buf, nwords) ! 14: * ! 15: * where arguments are declared as: ! 16: * ! 17: * int buf[]; array of words to be summed ! 18: * int nwords; number of 16-bit words in buf ! 19: * int check; returned value ! 20: */ ! 21: ! 22: .align 1 ! 23: .text ! 24: .globl _cksum ! 25: _cksum: ! 26: .word 0x4 /* save r2 */ ! 27: calls $0, _ovfloff /* clear overflow bit */ ! 28: movl 4(ap), r1 /* r1 = address of buf */ ! 29: movl 8(ap), r2 /* r2 = nwords */ ! 30: clrl r0 ! 31: loop: /* no ==> compute cksum */ ! 32: addw2 (r1)+, r0 ! 33: bcc decrmnt /* no carry ==> continue */ ! 34: incw r0 /* add carry to r0 */ ! 35: decrmnt: ! 36: sobgtr r2, loop /* not done? go back to loop */ ! 37: mcomw r0, r0 /* compute one's complement */ ! 38: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.