|
|
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.