home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 16
/
CD_ASCQ_16_0994.iso
/
maj
/
swag
/
crc.swg
< prev
next >
Wrap
Text File
|
1994-05-27
|
57KB
|
1 lines
SWAGOLX.EXE (c) 1993 GDSOFT ALL RIGHTS RESERVED 00016 16/32 BIT CRC ROUTINES 1 05-28-9313:35ALL SWAG SUPPORT TEAM 16BITCRC Routines IMPORT 6 N0ê0 {π>I'm looking For code to calculate the CRC32 of a series of Characters.ππ ...Unless you're CRCing a very large amount of data, this CRC-16π routine should do.ππ NOTE: This routine requires either TP6 or TP7 to compile.π}ππ{ Return a 16-bit CRC number For binary data. }ππFunction Crc16(Var Data; wo_Size : Word) : Word; Assembler;πAsmπ push dsπ xor dx, dxπ lds si, Dataπ mov bx, wo_Sizeπ@L1:π xor ah, ahπ lodsbπ mov cx, 8π shl ax, clπ xor dx, axπ mov cx, 8π@L2:π shl dx, 1π jnc @L3π xor dx, $1021π@L3:π loop @L2π dec bxπ jnz @L1π pop dsπ mov ax, dxπend; { Crc16. } 2 05-28-9313:35ALL ROBERT E. SWART File CHECKSUM IMPORT 21 N08⌐ {nice Program/utility which can be used to check the 'sorted' File and the dataπFile. It produces the Byte CheckSum of the Files (which must be identical), andπcan check the sortorder of the File (when given the option -s)...π}π{$A+,B-,D-,F-,G+,I-,L-,N-,O-,R-,S+,V-,X-}π{$M 16384,0,655360}π{ Here is the Program CHECKSUM that you can run to check the master dataπ File For TeeCee's String sorting contest. if you have a slow machine Iπ suggest you set the Program running and go to bed!! :-)ππ Code size: 5952 Bytesπ Data size: 924 Bytesπ .EXE size: 6304 Bytesπ}πUses Crt;πConstπ Version = 'CheckSum 1.0 (c) 1992 DwarFools & Consultancy, '+π 'by drs. Robert E. Swart'#13#10;π Usage = 'Usage: CheckSum dataFile [-s]'#13#10 +π ' Options: -s to check the sortorder of the Strings'#13#10;π MaxStr = 30;π Error: LongInt = 0;π Records: LongInt = 0;π CheckSum: Byte = 0; { Byte CheckSum of all Bytes in data File xor'ed }π Sortorder: Boolean = False; { Assume option -s is not given }ππVar Str: String[MaxStr];π len: Byte Absolute Str;π ByteStr: Array[0..MaxStr] of Byte Absolute Str;π PrevStr,UpperStr: String[MaxStr];π f: File;π i: Integer;ππbeginπ Writeln(Version);π if ParamCount = 0 thenπ beginπ Writeln(Usage);π Haltπ end;ππ assign(f,ParamStr(1)); { Change this to your chosen File name }π reset(f,1);π if Ioresult <> 0 thenπ beginπ Writeln('Error: could not open ',ParamStr(1));π Writeln(Usage);π Halt(1)π end;ππ if (ParamCount = 2) andπ ((ParamStr(2) = '-s') or (ParamStr(2) = '-S')) then Sortorder := True;ππ Writeln('Strings x 1000 checked:');π While not eof(f) doπ beginπ BlockRead(f,len,1);π BlockRead(f,Str[1],len);π For i:=0 to len do CheckSum := CheckSum xor ByteStr[i];π if Sortorder thenπ beginπ UpperStr[0] := Str[0];π For i:=1 to len do UpperStr[i] := UpCase(Str[i]);π if Records > 0 thenπ beginπ if PrevStr > UpperStr thenπ beginπ Inc(Error);π Writeln;π Writeln('Error: ',PrevStr,' > ',UpperStr);π end;π PrevStr := UpperStrπ endπ end;π Inc(Records);π if (Records mod 1000) = 0 thenπ beginπ GotoXY(1,WhereY);π Write(Records div 1000:3);π endπ end;π close(f);π Writeln;π Write(Records,' Strings checked, ');π if Sortorder then Writeln(Error,' Errors found, ');π Writeln('Byte CheckSum = ',CheckSum)πend.π 3 05-28-9313:35ALL GREG VIGNEAULT 16 BIT CRC IMPORT 35 N0▌ {π The following is a Turbo/Quick Pascal Implementation of calculatingπ the XModem Type of 16-bit cyclic redundancy checking (CRC).ππ Is there a preference For the language of the next CRC-16 exampleπ (80x86 Assembly, BASIC, or C) ?π}ππ(*******************************************************************)πProgram TPCRC16; { Compiler: TurboPascal 4.0+ & QuickPascal 1.0+ }π{ Turbo Pascal 16-bit Cyclic Redundancy Checking (CRC) a.la. XModem }π{ Greg Vigneault, Box 7169, Station A, toronto, Canada M5W 1X8. }ππConst Beep = #7; { ASCII bell tone }πType bArray = Array [1..$4000] of Byte; { define buffer }π bPointer = ^bArray; { Pointer to buffer }πVar DataPtr : bPointer; { Pointer to data }π fName : String; { File name }π fHandle : File; { File handle }π BytesIn : Word; { For counting data }π CRC16 : Integer; { running CRC-16 }ππ{-------------------------------------------------------------------}π Procedure WriteHex( raw : Integer ); { display hexadecimal value }π Var ch : Char;π shft : Byte;π beginπ if (raw = 0) then Write('0') { if zero }π else beginπ shft := 16; { bit count }π Repeat { isolate each hex nibble, and convert to ASCII }π DEC( shft, 4 ); { shift by nibble }π ch := CHR( raw SHR shft and $F or orD('0') ); {0..9 }π if (ch > '9') then inC( ch, 7 ); {A..F }π Write( ch ); { display the digit }π Until (shft = 0);π end;π end {WriteHex};ππ{-------------------------------------------------------------------}π Function UpdateCRC16(CRC : Integer; { CRC-16 to update }π InBuf : bPointer; { Pointer to data }π InLen : Integer) :Integer; { data count }π Var Bit, ByteCount : Integer;π Carry : Boolean; { catch overflow }π beginπ For ByteCount := 1 to InLen do { all data Bytes }π For Bit := 7 doWNto 0 do begin { 8 bits per Byte }π Carry := CRC and $8000 <> 0; { shift overlow? }π CRC := CRC SHL 1 or InBuf^[ByteCount] SHR Bit and 1;π if Carry then CRC := CRC xor $1021; { apply polynomial }π end; { For Bit & ByteCount } { all Bytes & bits }π UpdateCRC16 := CRC; { updated CRC-16 }π end {UpdateCRC16};ππ{-------------------------------------------------------------------}πbeginπ if ( MaxAvail < Sizeof(bArray) ) then begin { check For memory }π WriteLn( 'not enough memory!', Beep );π Halt(1);π end;π if (ParamCount <> 1) then begin { File name input? }π WriteLn( 'Use TPCRC16 <fName>', Beep );;π Halt(2);π end;π fName := ParamStr(1); { get File name }π Assign( fHandle, fName ); { open the File }π {$i-} Reset( fHandle, 1 ); {$i+} { open succeeded? }π if (IoResult <> 0) then begin { if not ... }π WriteLn( 'File access ERRor', Beep );π Halt(3);π end;π New( DataPtr ); { allocate memory }π CRC16 := 0; { initialize CRC-16 }π Repeatπ BlockRead( fHandle, DataPtr^[1], Sizeof(bArray), BytesIn );π CRC16 := UpdateCRC16( CRC16, DataPtr, BytesIn );π Until (BytesIn <> Sizeof(bArray)) or Eof(fHandle);π Close( fHandle ); { close input File }π DataPtr^[1] := 0; DataPtr^[2] := 0; { insert two nulls }π CRC16 := UpdateCRC16( CRC16, DataPtr, 2 ); { For final calc }π Dispose( DataPtr ); { release memory }π Write( 'The CRC-16 of File ', fName, ' is $' );π WriteHex( CRC16 ); WriteLn;ππend {TPCRCXMO}.π(*********************************************************************)π 4 05-28-9313:35ALL J.R. LOUVAU Another 16Bit CRC IMPORT 27 N0á Unit Crc16;πInterfaceπ{ Note: Your crc Variable must be initialized to 0, before }π{ using tis routine. }π{ Translated to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau }π{ }πFunction UpdCrc(cp: Byte; crc: Word): Word;ππImplementationππ(* crctab calculated by Mark G. Mendel, Network Systems Corporation *)πConst crctab : Array[0..255] of Word = (π $0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7,π $8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef,π $1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6,π $9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de,π $2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485,π $a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d,π $3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4,π $b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc,π $48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823,π $c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b,π $5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12,π $dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a,π $6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41,π $edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49,π $7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70,π $ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78,π $9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f,π $1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067,π $83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e,π $02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256,π $b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d,π $34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405,π $a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c,π $26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634,π $d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab,π $5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3,π $cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a,π $4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92,π $fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9,π $7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1,π $ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8,π $6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0π);ππ(*π * updcrc derived from article Copyright (C) 1986 Stephen Satchell.π * NOTE: First argument must be in range 0 to 255.π * Second argument is referenced twice.π *π * Programmers may incorporate any or all code into their Programs,π * giving proper credit within the source. Publication of theπ * source routines is permitted so long as proper credit is givenπ * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,π * Omen Technology.π *)πFunction UpdCrc(cp: Byte; crc: Word): Word;πbegin { UpdCrc }π UpdCrc := crctab[((crc SHR 8) and 255)] xor (crc SHL 8) xor cpπend;ππend. {Unit}π 5 05-28-9313:35ALL SWAG SUPPORT TEAM Checksum/16/32 CRC IMPORT 72 N0üh { Default Compiler Directives}π{$S-,R-,V-,I-,N-,B-,F-}ππ{$IFNDEF Ver40}π {Allow overlays}π {$F+,O-,X+,A-}π{$ENDIF}ππUNIT CRC;ππINTERFACEππfunction UpdateChecksum(CurByte : Byte; CheckSum : Word) : Word;π {-Returns an updated checksum}ππfunction UpdateCrc(CurByte : Byte; CurCrc : Word) : Word;π {-Returns an updated Crc16}ππFUNCTION UPDateCrcReverse (curByte : BYTE; CurCRC : WORD) : WORD;π { -returns reversed crc16}ππfunction UpdateCrcKermit(CurByte : Byte; CurCrc : Word) : Word;π {-Returns an updated Crc16 (kermit style)}ππconstπ Crc32Table : array[0..255] of LongInt = (π $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f, $e963a535,π $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988, $09b64c2b, $7eb17cbd,π $e7b82d07, $90bf1d91, $1db71064, $6ab020f2, $f3b97148, $84be41de, $1adad47d,π $6ddde4eb, $f4d4b551, $83d385c7, $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec,π $14015c4f, $63066cd9, $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4,π $a2677172, $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,π $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59, $26d930ac,π $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423, $cfba9599, $b8bda50f,π $2802b89e, $5f058808, $c60cd9b2, $b10be924, $2f6f7c87, $58684c11, $c1611dab,π $b6662d3d, $76dc4190, $01db7106, $98d220bc, $efd5102a, $71b18589, $06b6b51f,π $9fbfe4a5, $e8b8d433, $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb,π $086d3d2d, $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,π $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950, $8bbeb8ea,π $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65, $4db26158, $3ab551ce,π $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb, $4369e96a,π $346ed9fc, $ad678846, $da60b8d0, $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9,π $5005713c, $270241aa, $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409,π $ce61e49f, $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,π $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a, $ead54739,π $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8,π $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1, $f00f9344, $8708a3d2, $1e01f268,π $6906c2fe, $f762575d, $806567cb, $196c3671, $6e6b06e7, $fed41b76, $89d32be0,π $10da7a5a, $67dd4acc, $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8,π $a1d1937e, $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,π $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55, $316e8eef,π $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236, $cc0c7795, $bb0b4703,π $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28, $2bb45a92, $5cb36a04, $c2d7ffa7,π $b5d0cf31, $2cd99e8b, $5bdeae1d, $9b64c2b0, $ec63f226, $756aa39c, $026d930a,π $9c0906a9, $eb0e363f, $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae,π $0cb61b38, $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,π $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777, $88085ae6,π $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69, $616bffd3, $166ccf45,π $a00ae278, $d70dd2ee, $4e048354, $3903b3c2, $a7672661, $d06016f7, $4969474d,π $3e6e77db, $aed16a4a, $d9d65adc, $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5,π $47b2cf7f, $30b5ffe9, $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605,π $cdd70693, $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,π $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8dπ );ππvarπ Crc32TableOfs : Word;ππfunction UpdateCrc32(CurByte : Byte; CurCrc : LongInt) : LongInt;π {-Returns an updated crc32}ππ (* Model for inline code belowπ UpdateCrc32 := Crc32Table[Byte(CurCrc xor LongInt(CurByte))] xorπ ((CurCrc shr 8) and $00FFFFFF);π *)ππInline(π {;Get args -- DX:BX = CurCrc, CX = CurByte;}π $5B/ { POP BX}π $5A/ { POP DX}π $59/ { POP CX}π $52/ { PUSH DX}π $53/ { PUSH BX ;Save original CurCrc}π {;CX:AX := Get Crc32Table[CurCrc xor CurByte];} {!!.10}π $31/$CB/ { XOR BX,CX ;DX:BX = CurCrc xor CurByte}π $30/$FF/ { XOR BH,BH ;Byte(DX:BX)}π $D1/$E3/ { SHL BX,1 ;LongInt index}π $D1/$E3/ { SHL BX,1}π { $C4/$87/>CRC32TABLE/ LES AX,>Crc32Table[BX]} {!!.10}π $03/$1E/>CRC32TABLEOFS/{ ADD BX,[>Crc32TableOfs]} {!!.10}π $8B/$07/ { MOV AX,[BX]} {!!.10}π $8B/$4F/$02/ { MOV CX,[BX+2]} {!!.10}π {;DX:BX := (CurCrc shr 8) and $00FFFFFF;}π $5B/ { POP BX ;Get original CurCrc}π $5A/ { POP DX}π $51/ { PUSH CX ;Save CX} {!!.10}π $B9/$08/$00/ { MOV CX,8 ;Shift 8 bits}π $D1/$EA/ {C1: SHR DX,1 ;Hi reg into carry}π $D1/$DB/ { RCR BX,1 ;Carry into lo reg}π $E2/$FA/ { LOOP C1 ; for 8 bits}π $81/$E2/$FF/$00/ { AND DX,$00FF}π {;DX:AX := ES:AX xor DX:BX (sets function result)}π $59/ { POP CX} {!!.10}π $31/$D8/ { XOR AX,BX}π $89/$CB/ { MOV BX,CX} {!!.10}π $31/$DA); { XOR DX,BX}ππconstπ {The following table is used internally only. It is interfaced soπ that other programmers can use them with their own CRC routines}ππ CrcTable: array[0..255] of Word = (π $0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7,π $8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef,π $1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6,π $9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de,π $2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485,π $a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d,π $3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4,π $b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc,π $48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823,π $c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b,π $5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12,π $dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a,π $6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41,π $edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49,π $7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70,π $ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78,π $9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f,π $1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067,π $83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e,π $02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256,π $b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d,π $34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405,π $a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c,π $26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634,π $d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab,π $5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3,π $cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a,π $4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92,π $fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9,π $7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1,π $ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8,π $6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0π );ππimplementationππ function UpdateChecksum(CurByte : Byte; CheckSum : Word) : Word;π {-Returns an updated checksum}π beginπ UpdateCheckSum := CheckSum + CurByte;π end;ππ function UpdateCrc(CurByte : Byte; CurCrc : Word) : Word;π {-Returns an updated CRC16}π beginπ UpdateCrc := CrcTable[((CurCrc shr 8) and 255)] xorπ (CurCrc shl 8) xor CurByte;π end;ππ FUNCTION UPDateCrcReverse (curByte : BYTE; CurCRC : WORD) : WORD;π BEGIN { Updatecrcreverse .. need to be reversed for YMODEM,XMODEM }π UpDateCRCReverse := (Curcrc SHL 8) XOR ( CRCtable [ (curcrc SHR 8) XOR curByte] );π END;ππ function UpdateCrcKermit(CurByte : Byte; CurCrc : Word) : Word;π {-Returns an updated Crc16 (kermit style)}π varπ I : Integer;π Temp : Integer;π beginπ for I := 0 to 7 do beginπ Temp := CurCrc xor CurByte;π CurCrc := CurCrc shr 1;π if Odd(Temp) thenπ CurCrc := CurCrc xor $8408;π CurByte := CurByte shr 1;π end;π UpdateCrcKermit := CurCrc;π end;ππBEGIN { initialize CRC32 table }π Crc32TableOfs := Ofs(Crc32Table);πEND. 6 05-28-9313:35ALL SWAG SUPPORT TEAM 32 Bit CRC IMPORT 42 N0[ {π> I was kind of hoping to be ushered toward a File name I could locateπ> which would do what I need. (Produce 32 bit CRC's that are compatibleπ> With PKZIP's output).ππ I snagged this of this echo sometime ago. It does CRC32π using only TP With the help of a precalculated table.π It does procduce CRC32 values that are the same as PKZIP and ARJ.ππ--------------------- Unit CRC32C.PAS 8<-----------------------π{ Modified from a version posted on the Pascal echo by Floorπ A.C. Naaijkens (note introduction of a Constant and aπ Function and making the Array a Constant outside ofπ crc32() which should improve speed a lot; furtherπ references made to a C version in a File of Snippets from theπ(112 min left), (H)elp, More? C Echo marked as "Copyright (C) 1986 Gary S. Brown" (mostly toπ compare the large Arrays, which proved to be identical), and toπ "File verification using CRC" by Mark R. Nelson in Dr. Dobbs'π Journal, May 1992. The latter provided the final piece ofπ crucial information. Use: 1) Create a LongInt Variable For theπ CRC value; 2) Initialize this With CRCSeed; 3) Build theπ CRC Byte-by-Byte With CRC32(); 4) Finish With CRCend()π (this was the part I found in Nelson). The result is a CRCπ value identical to that calculated by PKZip and ARJ.π}πUnit CRC32c;πInterfaceπ Constπ CRCSeed = $ffffffff;π CRC32tab : Array[0..255] of LongInt = (π $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,π $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,π $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,π $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,π $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,π $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,π $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,π $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,π $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,π $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,π $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,π $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,π $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,π $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,π $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,π $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,π $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,π $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,π $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,π $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,π $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,π $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,π $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,π $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,π $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,π $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,π $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,π $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,π $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,π $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,π $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,π $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,π $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,π $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,π $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,π $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,π $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,π $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,π $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,π $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,π $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,π $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,π $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d );πFunction CRC32(value: Byte; crc: LongInt) : LongInt;πFunction CRCend( crc : LongInt ) : LongInt ;ππImplementationππFunction CRC32(value: Byte; crc: LongInt) : LongInt;πbeginπ CRC32 := CRC32tab[Byte(crc xor LongInt(value))] xorπ ((crc shr 8) and $00ffffff);πend;ππFunction CRCend( crc : LongInt ): LongInt;πbeginπ CRCend := (crc xor CRCSeed);πend;ππend.ππ{πNow to use it...ππWith a LongInt Variable, say vCRC32, first seed itπ vCRC32 := CRCSeed;πThen go Byte-by-Byte thorugh to calculate:π For P := 1 to Size DOπ vCRC32 := CRC32(Bytes[P], vCRC32);ππ Then finish it off With CRCendππ vCRC32 := CRCend(vCRC32);ππ You should be able to Write your own Dec2Hex Function =)π}π 7 05-28-9313:35ALL FLOOR A.C. NAAIJKENS File CRC Routines IMPORT 81 N0ì_ {πAuthor: FLOOR A.C. NAAIJKENSππPart of The ECO Library II:π}ππUnit Eco_CRC;ππInterfaceππFunction __CRC32(Value: Byte; CRC : LongInt) : LongInt;πFunction __CRC16(Value: Byte; CRC : Word) : Word;ππImplementationππFunction __crc32(value: Byte; crc: LongInt): LongInt;πConstπ crc32_table : Array[0..255] of LongInt = (π $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,π $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,π $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,π $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,π $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,π $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,π $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,π $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,π $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,π $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,π $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,π $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,π $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,π $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,π $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,π $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,π $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,π $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,π $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,π $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,π $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,π $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,π $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,π $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,π $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,π $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,π $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,π $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,π $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,π $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,π $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,π $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,π $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,π $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,π $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,π $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,π $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,π $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,π $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,π $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,π $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,π $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,π $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8dπ );ππbeginπ if crc = 0 thenπ crc := $ffffffff; { must be set high to start With }π __crc32 := crc32_table[Byte(crc xor LongInt(value))] xorπ ((crc shr 8) and $00ffffff);πend;ππππFunction __crc16(value: Byte; crc: Word): Word;πConstπ crc16_table : Array[0..255] of Word = (π $0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7,π $8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef,π $1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6,π $9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de,π $2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485,π $a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d,π $3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4,π $b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc,π $48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823,π $c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b,π $5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12,π $dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a,π $6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41,π $edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49,π $7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70,π $ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78,π $9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f,π $1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067,π $83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e,π $02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256,π $b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d,π $34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405,π $a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c,π $26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634,π $d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab,π $5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3,π $cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a,π $4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92,π $fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9,π $7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1,π $ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8,π $6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0π );ππbeginπ __crc16 := crc16_table[((crc shr 8) and 255)] xorπ (crc shl 8) xor value;πend;ππππend.ππ{==========================================================================}π{==========================================================================}π{==========================================================================}ππCRC.PASπ{$M 65520, 0, 655360}πUsesπ Crt, Dos,π eco_lib;ππVarπ take32,π take16 : Boolean;π sourcepath,π source : String;π numFiles, i : Word;π srec : SearchRec;π filar : Array[1..1024] of ^SearchRec;ππππFunction convert32(fname: String; fsize: LongInt; x1, x2, y: Byte): String;πConstπ bufsize = 32768;πTypeπ fbuf = Array[1..bufsize] of Byte;πVarπ i : Word;π source : File;π bread : Word;π Filebuf : ^fbuf;π crc, tr : LongInt;π nr : Real;ππbeginπ crc := $ffffffff;π tr := 0;π new(Filebuf);π assign(source, fname);π reset(source, 1);π GotoXY(x1, y);π Write(__rep(x2-x1-3, '░'));π Write(' ', fname);π Repeatπ blockread(source, Filebuf^, bufsize, bread);π tr := tr + bread;π nr := tr/fsize;π nr := nr * (x2-x1-3);π GotoXY(x1, y);π Write(__rep(trunc(nr), '█'));π For i := 1 to bread doπ crc := __crc32(Filebuf^[i], crc);π Until (bread = 0);π close(source);π GotoXY(x1, y);π dispose(Filebuf);π Write(fname:12, ' ', fsize:7, ' Bytes. HEX-CRC/32: ',__tohexstr(crc, 4));π clreol; convert32 := '';πend;ππFunction convert16(fname: String; fsize: LongInt; x1, x2, y: Byte): String;πConstπ bufsize = 32768;πTypeπ fbuf = Array[1..bufsize] of Byte;πVarπ i : Word;π source : File;π bread : Word;π Filebuf : ^fbuf;π crc, tr : LongInt;π nr : Real;ππbeginπ crc := $0000;π tr := 0;π new(Filebuf);π assign(source, fname);π reset(source, 1);π GotoXY(x1, y);π Write(__rep(x2-x1-3, '░'));π Write(' ', fname);π Repeatπ blockread(source, Filebuf^, bufsize, bread);π tr := tr + bread;π nr := tr/fsize;π nr := nr * (x2-x1-3);π GotoXY(x1, y);π Write(__rep(trunc(nr), '█'));π For i := 1 to bread doπ crc := __crc16(Filebuf^[i], crc);π Until (bread = 0);π close(source);π GotoXY(x1, y);π dispose(Filebuf);π Write(fname:12, ' ', fsize:7, ' Bytes. HEX-CRC/16: ', __tohexstr(crc, 2));π clreol;π convert16 := '';πend;ππππFunction convert16_32(fname:String; fsize: LongInt; x1, x2, y: Byte):String;πConstπ bufsize = 32768;πTypeπ fbuf = Array[1..bufsize] of Byte;πVarπ i : Word;π source : File;π bread : Word;π Filebuf : ^fbuf;π crc,π crc32,π tr : LongInt;π nr : Real;ππbeginπ crc := $0000;π tr := 0;π crc32 := $ffffffff;π new(Filebuf);π assign(source, fname);π reset(source, 1);π GotoXY(x1, y);π Write(__rep(x2-x1-3, '░'));π Write(' ', fname);π Repeatπ blockread(source, Filebuf^, bufsize, bread);π tr := tr + bread;π nr := tr/fsize;π nr := nr * (x2-x1-3);π GotoXY(x1, y);π Write(__rep(trunc(nr), '█'));π For i := 1 to bread do beginπ crc := __crc16(Filebuf^[i], crc);π crc32 := __crc32(Filebuf^[i], crc32);π end;π Until (bread = 0);π close(source);π GotoXY(x1, y);π dispose(Filebuf);π Write(fname:12, ' ', fsize:7,' Bytes. HEX-CRC/16: ', __tohexstr(crc, 2),π ' 32: ', __tohexstr(crc32, 4));π clreol;π convert16_32 := '';πend;πππππ{main}πbeginπ source := fexpand(paramstr(1));π take32 := False;π take16 := False;π if paramstr(2) = '/32' thenπ take32 := True;π if paramstr(2) = '/16' thenπ take16 := True;π numFiles := 0;π findfirst(source, anyFile, srec);π While Doserror=0 doπ beginπ if not (((srec.attr and directory) > 0) or ((srec.attr and volumeid) > 0)π and (srec.size > 0)) thenπ beginπ inc(numFiles);π new(filar[numFiles]);π filar[numFiles]^ := srec;π filar[numFiles]^.name := __up(filar[numFiles]^.name);π end; findnext(srec);π end;π Writeln(numFiles, ' File(s) found.');ππ For i := 1 to numFiles doπ if take32 thenπ Writeln(convert32(sourcepath + filar[i]^.name, filar[i]^.size,π 5, 35, WhereY))π elseπ if take16 thenπ Writeln(convert16(sourcepath + filar[i]^.name, filar[i]^.size,π 5, 35, WhereY))π elseπ Writeln(convert16_32(sourcepath + filar[i]^.name, filar[i]^.size,π 5, 35, WhereY));πend.ππππ 8 05-28-9313:35ALL TREVOR J. CARLSEN File MODS With CRC Check IMPORT 62 N0Ü {$X+}πUnit selfmod;ππ { Author Trevor J Carlsen - released into the public domain 1991 }π { PO Box 568 }π { Port Hedland } π { Western Australia 6721 }π { Voice +61 91 73 2026 Data +61 91 73 2569 }π { FidoNet 3:690/644 }π { Allows a Program to self modify a Typed Constant in the .exe File. It }π { also perForms an automatic checksum Type .exe File integrity check. }π { A LongInt value is added to the end of the exe File. This can be read by }π { a separate configuration Program to enable it to determine the start of }π { the Programs configuration data area. to use this the configuration }π { Typed Constant should be added immediately following the declaration of }π { ExeData. }π π { Where this Unit is used, it should always be the FIRST Unit listed in the }π { Uses declaration area of the main Program. }π π { Requires Dos 3.3 or later. Program must not be used With PKLite or LZExe }π { or any similar exe File Compression Programs. It may also cause }π { difficulties on a network or virus detection Programs. }π π { The stack size needed is at least 9,000 Bytes. }π πInterfaceππUsesπ globals;ππTypeπ ExeDataType = Recordπ IDStr : str7;π UserName : str35;π FirstTime : Boolean;π NumbExecs : shortint;π Hsize : Word;π ExeSize : LongInt;π CheckSum : LongInt;π StartConst : LongInt;π RegCode : LongInt;π end;πConstπ ExeData : ExeDataType = (IDStr : 'ID-AREA';π UserName : '';π FirstTime : True;π NumbExecs : -1;π Hsize : 0;π ExeSize : 0;π CheckSum : 0;π StartConst: 0;π RegCode : 0);πππ{$I p:\prog\freeload.inc} { Creates CodeStr that MUST match RegStr }ππ{$I p:\prog\registed.inc} { Creates CodeChkStr that MUST hash to RegCode}ππConstπ mark : Byte = 0;ππVarπ first : Boolean;ππProcedure Hash(p : Pointer; numb : Byte; Var result: LongInt);ππFunction Write2Exec(Var data; size: Word): Boolean;ππImplementationπππProcedure Hash(p : Pointer; numb : Byte; Var result: LongInt);π { When originally called numb must be equal to sizeof }π { whatever p is pointing at. if that is a String numb }π { should be equal to length(the_String) and p should be } π { ptr(seg(the_String),ofs(the_String)+1) }π Varπ temp,π w : LongInt;π x : Byte;ππ beginπ temp := LongInt(p^); RandSeed := temp;π For x := 0 to (numb - 4) do beginπ w := random(maxint) * random(maxint) * random(maxint);π temp := ((temp shr random(16)) shl random(16)) +π w + MemL[seg(p^):ofs(p^)+x];π end;π result := result xor temp;π end; { Hash }πππProcedure InitConstants;π Varπ f : File;π tbuff : Array[0..1] of Word;π π Function GetCheckSum : LongInt; π { PerForms a checksum calculation on the exe File }π Varπ finished : Boolean;π x,π CSum : LongInt;π BytesRead : Word;π buffer : Array[0..4095] of Word;π beginπ {$I-}π seek(f,0);π finished := False; CSum := 0; x := 0;π BlockRead(f,buffer,sizeof(buffer),BytesRead);π While not finished do begin { do the checksum calculations }π Repeat { Until File has been read up to start of config area }π inc(CSum,buffer[x mod 4096]);π inc(x);π finished := ((x shl 1) >= ExeData.StartConst); π Until ((x mod 4096) = 0) or finished;π if not finished then { data area has not been reached }π BlockRead(f,buffer,sizeof(buffer),BytesRead); π end;π GetCheckSum := CSum;π end; { GetCheckSum }π π π beginπ assign(f, ParamStr(0));π {$I-} Reset(f,1);π With ExeData do beginπ first := FirstTime;π if FirstTime and (Ioresult = 0) then beginπ Seek(f,2); { this location has the executable size }π BlockRead(f,tbuff,4);π ExeSize := tbuff[0]+(pred(tbuff[1]) shl 9);π seek(f,8); { get the header size }π BlockRead(f,hsize,2);π FirstTime := False;π StartConst := LongInt(hsize+Seg(ExeData)-PrefixSeg) shl 4 + π ofs(ExeData) - 256;π CheckSum := GetCheckSum;π Seek(f,StartConst);π BlockWrite(f,ExeData,sizeof(ExeData));π seek(f,FileSize(f));π BlockWrite(f,StartConst,4);π endπ elseπ if GetCheckSum <> CheckSum then beginπ Writeln('File has been tampered with. Checksum incorrect');π halt;π end;π end; { With } π Close(f); {$I+}π if Ioresult <> 0 then beginπ Writeln('Unable to initialise Program');π halt;π end; π end; { InitConstants }πππFunction Write2Exec(Var data; size: Word): Boolean;π { Writes a new Typed Constant into the executable File after first checking }π { that it is safe to do so. It does this by ensuring that the IDString is }π { at the File offset expected. }π Constπ FName : str40 = '';π Varπ f : File;π st : str8;π BytesRead : Word;π beginπ if UseCfg then beginπ if length(FName) = 0 then beginπ TempStr := ParamStr(0);π TempStrLen := pos('.',TempStr) - 2;π FName := TempStr + ' . ';π { │ │││ }π { │ ││└────»» #255 }π { │ │└─────»» #32 }π { │ └──────»» #255 }π { └────────»» #255 }π { Using the above File name For the configuration File makes the }π { deletion of the File difficult For the average user. }π end; { if length }π assign(f, FName);π if exist(FName) then beginπ {$I-}π reset(f,1);π if first then beginπ first := False;π BlockRead(f, ExeData, ofs(mark)-ofs(ExeData),BytesRead)π end elseπ BlockWrite(f,data,size);π end else beginπ reWrite(f,1);π BlockWrite(f,Data,size);π end;π close(f);π {$I+}π Write2Exec := Ioresult = 0;π end else beginπ assign(f, ParamStr(0));π {$I-} Reset(f,1);π Seek(f,LongInt(ExeData.Hsize+Seg(ExeData)-PrefixSeg) shl 4π + ofs(ExeData)- 256);π BlockRead(f,st,9);π if st = ExeData.IDStr then { all Ok to proceed } beginπ Seek(f,LongInt(ExeData.Hsize+Seg(data)-PrefixSeg) shl 4π + ofs(data)- 256);π BlockWrite(f,data,size);π Close(f); {$I+}π Write2Exec := Ioresult = 0;π end elseπ Write2Exec := False;π end;π end; { Write2Exec }π πbeginπ first := True;π if not UseCfg thenπ InitConstantsπ elseπ Write2Exec(ExeData,ofs(mark)-ofs(ExeData));πend.π 9 08-27-9320:34ALL GUY MCLOUGLIN 16 Bit CRC IMPORT 13 N0qó {πGUY MCLOUGHLINππ>I wanted to ask you... would you happen to know how a CRC Check-sumπ>works? Everytime I go to look this up in a book I see a bunch ofπ>stuff about X^7 + X^12 + X^17..... (and on and on) but nothing thatπ>actually says "Here's what the code looks like" ... just a bunch ofπ>non-sensical bull...Would you happen to know the algorithm that isπ>used?ππ ...Greg Vigneault is much better at this stuff than I am. Iπ usually know "why" something works, but not always "how". <g>π The basic idea is that the data is treated as input to a specificπ polynomial equation (ie: X^32 + X^26 + X^23 + X^22 + X^16 + X^12),π the result of this is then divided by a specific prime number, andπ the remainder left over is the CRC value. I know that this isπ easier said than understood, but that's the gist of it.ππ ...if a single bit of a chunk of data is changed, the chancesπ are very good that a CRC check number would catch this change.π It's not 100 percent guaranteed, but something more like 99.97π percent, so CRCs are not an entirely bulletproof check. Here'sπ a standard Pascal Implementation of a CRC-16 routine:π}ππFunction CRC16(InString: String) : Word;πVarπ CRC : Word;π Index1,π Index2 : Byte;πbeginπ CRC := 0;π For Index1 := 1 to length(S) doπ beginπ CRC := (CRC xor (ord(InString[Index1]) SHL 8));π For Index2 := 1 to 8 doπ if ((CRC and $8000) <> 0) thenπ CRC := ((CRC SHL 1) xor $1021)π elseπ CRC := (CRC SHL 1)π end;π CRC16 := (CRC and $FFFF)πend;ππ 10 08-27-9320:34ALL SAM LEVENTER 16 & 32 BIT CRC IMPORT 12 N0V {πSAM LEVENTERππ> I'm not quite sure how CRC's work. I have routines For calculating bothπ> 16-bit and 32-bit CRC values, however, they seem to be only For one Byte.π> How would I go about calculating the 16-bit CRC of an entire File?ππ CRCs are CYCLIC redundancy codes. That means that you cycle through theπentire File, ORing it With the old CRC.ππJust call updateCRC in the below Unit.ππThis Program is donated to the PublicπDomain by MarshallSoft Computing, Inc.πIt is provided as an example of the useπof the Personal Communications Library.π}ππUnit mycrc16;ππInterfaceππFunction UpdateCRC(crc:Word;data:Byte):Word;ππImplementationππConstπ POLY = $1021;ππVarπ CRCtable : Array [0..255] of Word;ππ{ compute updated CRC }πFunction UpdateCRC(crc : Word; data : Byte) : Word;πbeginπ UpDateCRC := (crc SHL 8) xor (CRCtable[(crc SHR 8) xor data]);πend;ππ{ initialize CRC table }πProcedure InitCRC;πVarπ i : Integer;ππ { calculate CRC table entry }π Function CalcTable(data, genpoly, accum : Word) : Word;π Varπ i : Word;π beginπ data := data SHL 8;π For i := 8 downto 1 doπ beginπ if ((data xor accum) and ($8000 <> 0)) thenπ accum := (accum SHL 1) xor genpolyπ elseπ accum := accum SHL 1;π data := data SHL 1;π end;π CalcTable := accum;π end;ππbeginπ For i := 0 to 255 doπ CRCtable[i] := CalcTable(i, POLY, 0);πend;ππbeginπ InitCRC;πend.π 11 08-27-9321:48ALL SEAN PALMER Quick CRC Methods IMPORT 12 N0g {πSEAN PALMERππHere are some that make their tables on the fly (to save echo space)ππI believe crc should be inited to 0 at startππThis CRC-16 is not identical to the one used by the Xmodem and ZmodemπFile transfer protocols. The polynomial is the sameπ(X^16+X^12+X^5+X^0 or 0x8408) but the bit-ordering is the opposite,πand preconditioning and postconditioning is used as in 32-bit CRCs.πThis method is also used by the European version of X.25.π}ππVarπ crc16table : Array [Byte] of Word;ππProcedure makeCRC16table;πVarπ crc : Word;π i,n : Byte;πbeginπ For i := 0 to 255 doπ beginπ crc := i;π For n := 1 to 8 doπ if odd(crc) thenπ crc := (crc shr 1) xor $8408π elseπ crc := crc shr 1;ππ crc16table[i] := crc;π end;πend;ππFunction updateCRC16(c : Byte; crc : Word) : Word;πbeginπ updateCRC16 := crc16table[lo(crc) xor c] xor hi(crc);πend;ππ{this is the same crc used For zModem crc32}ππVarπ crc32table : Array [Byte] of LongInt;ππProcedure makeCRC32table;πVarπ crc : LongInt;π i,n : Byte;πbeginπ For i := 0 to 255 doπ beginπ crc := i;π For n := 1 to 8 doπ if odd(crc) thenπ crc := (crc shr 1) xor $EDB88320π elseπ crc := crc shr 1;ππ crc32table[i] := crc;π end;πend;ππFunction updateCRC32(c : Byte; crc : LongInt) : LongInt;πbeginπ updateCRC32 := crc32table[lo(crc) xor c] xor (crc shr 8);πend;π 12 08-27-9322:13ALL SEAN PALMER XORSUM CRC Method IMPORT 11 N0│S {πSEAN PALMERππ>> (more than I thought I would have). There were 190 collisionsπ>> out of 572 names.ππ>The solution would be to use a better hashing algorythm, simplyπ>adding up the ascii characters is not unique enough. You bestπ>approach would be to generate a CRC value for your hashing tableπ>rather then the checksum approach.ππOr try this xorsum method (my own invention, have to plug for it... 8)ππLots faster than a crc with no table, with similar results.ππNOT compatible with a crc.ππThis xorsum algorithm is hereby standardized and if anyone wants to useπit you should make sure your xorsum routines give the same results.π}ππfunction XorSum16(var data; size : word; prevSum : word) : word; assembler;πasmπ push dsπ lds si, dataπ mov cx, sizeπ mov bx, prevSumπ mov dx, $ABCDπ cldπ jcxz @Xπ @L:π lodsbπ rol bx, 1π xor bx, dxπ xor bl, alπ loop @Lπ @X:π mov ax, bxπ pop dsπend;ππ{ to use on a string, for instance: }ππconstπ s : string = 'this is a test';ππbeginπ writeln(xorsum16(s, length(s) + 1, 0));πend.π{πsend 0 as prevSum if you're not accumulating a result...otherwise sendπthe result from the previous buffer.π}ππ 13 11-02-9305:24ALL ROBERT E. SWART File Checksum IMPORT 21 N0yé {πProgram/utility which can be used to check the 'sorted' File and the dataπFile. It produces the Byte CheckSum of the Files (which must be identical),πand can check the sortorder of the File (when given the option -s)...π}π{$A+,B-,D-,F-,G+,I-,L-,N-,O-,R-,S+,V-,X-}π{$M 16384,0,655360}π{ Here is the Program CHECKSUM that you can run to check the master dataπ File For TeeCee's String sorting contest. if you have a slow machine Iπ suggest you set the Program running and go to bed!! :-)ππ Code size: 5952 Bytesπ Data size: 924 Bytesπ .EXE size: 6304 Bytesπ}πUsesπ Crt;ππConstπ Version = 'CheckSum 1.0 (c) 1992 DwarFools & Consultancy, '+π 'by drs. Robert E. Swart'#13#10;π Usage = 'Usage: CheckSum dataFile [-s]'#13#10 +π ' Options: -s to check the sortorder of the Strings'#13#10;π MaxStr = 30;π Error : LongInt = 0;π Records : LongInt = 0;π CheckSum : Byte = 0; { Byte CheckSum of all Bytes in data File xor'ed }π Sortorder : Boolean = False; { Assume option -s is not given }ππVarπ Str : String[MaxStr];π len : Byte Absolute Str;π ByteStr : Array [0..MaxStr] of Byte Absolute Str;π PrevStr,π UpperStr : String[MaxStr];π f : File;π i : Integer;ππbeginπ Writeln(Version);π if ParamCount = 0 thenπ beginπ Writeln(Usage);π Halt;π end;ππ assign(f, ParamStr(1)); { Change this to your chosen File name }π reset(f, 1);π if Ioresult <> 0 thenπ beginπ Writeln('Error: could not open ', ParamStr(1));π Writeln(Usage);π Halt(1);π end;ππ if (ParamCount = 2) and ((ParamStr(2) = '-s') or (ParamStr(2) = '-S')) thenπ Sortorder := True;ππ Writeln('Strings x 1000 checked:');π While not eof(f) doπ beginπ BlockRead(f, len, 1);π BlockRead(f, Str[1], len);π For i := 0 to len doπ CheckSum := CheckSum xor ByteStr[i];ππ if Sortorder thenπ beginπ UpperStr[0] := Str[0];π For i := 1 to len doπ UpperStr[i] := UpCase(Str[i]);π if Records > 0 thenπ beginπ if PrevStr > UpperStr thenπ beginπ Inc(Error);π Writeln;π Writeln('Error: ',PrevStr,' > ',UpperStr);π end;π PrevStr := UpperStr;π end;π end;π Inc(Records);π if (Records mod 1000) = 0 thenπ beginπ GotoXY(1, WhereY);π Write(Records div 1000:3);π end;π end;π close(f);π Writeln;π Write(Records,' Strings checked, ');π if Sortorder thenπ Writeln(Error, ' Errors found, ');π Writeln('Byte CheckSum = ', CheckSum);πend.π 14 11-02-9316:14ALL HELGE HELGESEN CheckSums in BASM IMPORT 7 N0[Σ (* ===========================================================================πDate: 09-29-93 (11:16)πFrom: HELGE HELGESENπSubj: Checksums?ππ How does one compute simple checksums? For example for a byteπ sequence $8A $05 $7E $1C, what would the checksum be? Whereπ could I get some info on this?ππHere's one that simply adds each byte together and sends back theπresult:π===========================================================================*)ππfunction MakeCheckSum(p: pointer; length: word): byte; assembler;πasmπ cldπ push dsπ xor ah, ahπ mov cx, lengthπ jcxz @xπ lds si, pπ@1:π lodsbπ add ah, alπ loop @1π@x:π pop dsπ mov al, ahπend;ππSo you call this like this:ππx:=MakeCheckSum(@myvar, length_of_var);ππ 15 05-25-9408:03ALL DON PAULSEN Fast 16bit CRC SWAG9405 17 N0▌╟ π{π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;ππ 16 05-26-9406:16ALL DAVID DUNSON Normalize CRC CalculationIMPORT 7 N0º▓ π{πFrom what I gather from these two routines, in order to "Normalize" a crcπvalue, you must reverse the order of the four bytes in the value.ππExample: crc value = $01020304π normalized = $04030201ππAm I correct in assuming this?ππIf so, the two procedures above fail to perform that task, so here is a BASMπroutine that I have tested and works perfectly.π}ππProcedure Normalize(Var crc: LongInt); Assembler;πASMπ LES DI, crcπ MOV AX, WORD PTR ES:[DI]π MOV BX, WORD PTR ES:[DI + 2]π XCHG AH, ALπ XCHG BH, BLπ MOV WORD PTR ES:[DI + 2], AXπ MOV WORD PTR ES:[DI], BXπEnd;ππPlease forward a copy of your response to Serge Paquin who wrote the originalπrequest for CRC routines.π