_FLETCHER'S CHECKSUM_ by John Kodis Example 1: (a) integer i, sum1, sum2; sum1 = 0; sum2 = 0; for i from 1 to message_length do sum1 = ( sum1 + message[i] ) modulo 255; sum2 = ( sum2 + sum1 ) modulo 255; end for. (b) check1 = 255 - (( sum1 + sum2 ) modulo 255); message[message_length+1] = check1; check2 = 255 - (( sum1 + check1 ) modulo 255); message[message_length+2] = check2; Example 2: (a) register unsigned char *ptr; register short int i, len, sum1, sum2; sum1 = sum2 = 0; for (i=0; i= 255) sum1 -= 255; sum2 += sum1; if (sum2 >= 255) sum2 -= 255; } (b) moveq #0,d5 move.w d5,d4 ;sum1 = sum2 = 0; moveq #0,d6 bra.s L_29 ;for(i=0; i= 255) sum1 -= 255; L_32 add.w d4,d5 ; sum2 += sum1; cmp.w #255,d5 blt.s L_36 sub.w #255,d5 ; if(sum2 >= 255) sum2 -= 255; L_36 addq.w #1,d6 L_29 cmp.w d7,d6 blt.s L_28 ;} Example 3: (a) register unsigned char *ptr; register short int sum1, len; register unsigned long int sum2; sum1 = sum2 = 0; while (len--) { sum1 += *ptr++; if (sum1 >= 255) sum1 -= 255; sum2 += sum1; } sum2 %= 255; (b) loop moveq #0,d3 move.b (a3)+,d3 add.w d3,d0 ; sum1 += *ptr++; cmp.w #255,d0 blt.s no sub sub.w #255,d0 ; if (sum1 >= 255) sum1 -= 255; no_sub add.1 d0,d1 ; sum2 += sum1; dbra d2,loop ; while (len--); Example 4: ; Register Usage ; D0 the first checksum value (sum1) ; D1 the second checksum value (sum2) ; D2 the length in bytes of the buffer (len) ; D4 contains zero, for the addx.b instructions ; A0 pointer into the buffer (ptr) loop add.b (a0)+,d0 ; sum1 += *ptr++; addx.b d4,d0 ; if (sum1 >= 256) sum1 += 1; add.l d0,d1 ; sum2 += sum1; dbra d2,loop ; while (len--);