Contributor: DON PAULSEN 
{
RE: SWAG submission
 This 16-bit CRC function is compatible with those used in Chuck
 Forsberg's X-modem protocol. It's very fast, because I unrolled
 the "for (i = 0; i < 8; ++i)" loop. If a 32-bit CRC is not necessary, this is a great alternative because of its speed and small size. {==============================================================} FUNCTION Crc16 (var buffer; size, seed: word): word; assembler; { Set size parameter to 0 to process 64K. If processing only one buffer, set seed parameter to 0 -- otherwise set to result from previous calculation. C code translated by Don Paulsen. } (* This routine is a translation of the following C code by Chuck Forsberg. The added "seed" parameter allows for finding the CRC value of data spanning multiple buffers. The innermost loop has been unrolled at a cost of 32 bytes in code, but the speed increase is nearly two-fold. int Crc16 (ptr, count) char *ptr; int count; { int crc, i; crc = 0; while (--count>= 0) {
 crc = crc ^ (int)*ptr++ << 8;
 for (i = 0; i < 8; ++i)
 if (crc & 0x8000)
 crc = crc << 1 ^ 0x1021;
 else
 crc = crc << 1;
 }
 return (crc & 0xFFFF);
 }
*)
ASM
 les di, buffer
 mov dx, size
 mov ax, seed
 mov si, 1021h
@next:
 xor bl, bl
 mov bh, es:[di]
 xor ax, bx
 shl ax, 1; jnc @noXor1; xor ax, si
@noXor1:
 shl ax, 1; jnc @noXor2; xor ax, si
@noXor2:
 shl ax, 1; jnc @noXor3; xor ax, si
@noXor3:
 shl ax, 1; jnc @noXor4; xor ax, si
@noXor4:
 shl ax, 1; jnc @noXor5; xor ax, si
@noXor5:
 shl ax, 1; jnc @noXor6; xor ax, si
@noXor6:
 shl ax, 1; jnc @noXor7; xor ax, si
@noXor7:
 shl ax, 1; jnc @noXor8; xor ax, si
@noXor8:
 inc di
 dec dx
 jnz @next
END;
 

AltStyle によって変換されたページ (->オリジナル) /