Posted: Tue Feb 05, 2002 12:50 pm
Restored from previous forum. Originally posted by Rings.
;Enable Inline-asm !
;CRC16 Adaption by Siegfried Rings February,5.the 2002
;
;Evalutate the 16-bit CRC (Cyclic Redundancy Checksum) of an MemoryBlock
;
;
; Can be more optimized with pure inline-asm.
Procedure XOR(a,b)
MOV eax,a
XOR eax,b
MOV a,eax
ProcedureReturn a
EndProcedure
Procedure.l CRC16(StartAddress, Size)
i.l
fcs.l
Dim fcstab.l(255)
pppinitfcs16 = $FFFF ;Initial FCS value
; Initialize array once And For all
fcstab(0) = $0
fcstab(1) = $1189
fcstab(2) = $2312
fcstab(3) = $329B
fcstab(4) = $4624
fcstab(5) = $57AD
fcstab(6) = $6536
fcstab(7) = $74BF
fcstab(8) = $8C48
fcstab(9) = $9DC1
fcstab(10) = $AF5A
fcstab(11) = $BED3
fcstab(12) = $CA6C
fcstab(13) = $DBE5
fcstab(14) = $E97E
fcstab(15) = $F8F7
fcstab(16) = $1081
fcstab(17) = $108
fcstab(18) = $3393
fcstab(19) = $221A
fcstab(20) = $56A5
fcstab(21) = $472C
fcstab(22) = $75B7
fcstab(23) = $643E
fcstab(24) = $9CC9
fcstab(25) = $8D40
fcstab(26) = $BFDB
fcstab(27) = $AE52
fcstab(28) = $DAED
fcstab(29) = $CB64
fcstab(30) = $F9FF
fcstab(31) = $E876
fcstab(32) = $2102
fcstab(33) = $308B
fcstab(34) = $210
fcstab(35) = $1399
fcstab(36) = $6726
fcstab(37) = $76AF
fcstab(38) = $4434
fcstab(39) = $55BD
fcstab(40) = $AD4A
fcstab(41) = $BCC3
fcstab(42) = $8E58
fcstab(43) = $9FD1
fcstab(44) = $EB6E
fcstab(45) = $FAE7
fcstab(46) = $C87C
fcstab(47) = $D9F5
fcstab(48) = $3183
fcstab(49) = $200A
fcstab(50) = $1291
fcstab(51) = $318
fcstab(52) = $77A7
fcstab(53) = $662E
fcstab(54) = $54B5
fcstab(55) = $453C
fcstab(56) = $BDCB
fcstab(57) = $AC42
fcstab(58) = $9ED9
fcstab(59) = $8F50
fcstab(60) = $FBEF
fcstab(61) = $EA66
fcstab(62) = $D8FD
fcstab(63) = $C974
fcstab(64) = $4204
fcstab(65) = $538D
fcstab(66) = $6116
fcstab(67) = $709F
fcstab(68) = $420
fcstab(69) = $15A9
fcstab(70) = $2732
fcstab(71) = $36BB
fcstab(72) = $CE4C
fcstab(73) = $DFC5
fcstab(74) = $ED5E
fcstab(75) = $FCD7
fcstab(76) = $8868
fcstab(77) = $99E1
fcstab(78) = $AB7A
fcstab(79) = $BAF3
fcstab(80) = $5285
fcstab(81) = $430C
fcstab(82) = $7197
fcstab(83) = $601E
fcstab(84) = $14A1
fcstab(85) = $528
fcstab(86) = $37B3
fcstab(87) = $263A
fcstab(88) = $DECD
fcstab(89) = $CF44
fcstab(90) = $FDDF
fcstab(91) = $EC56
fcstab(92) = $98E9
fcstab(93) = $8960
fcstab(94) = $BBFB
fcstab(95) = $AA72
fcstab(96) = $6306
fcstab(97) = $728F
fcstab(98) = $4014
fcstab(99) = $519D
fcstab(100) = $2522
fcstab(101) = $34AB
fcstab(102) = $630
fcstab(103) = $17B9
fcstab(104) = $EF4E
fcstab(105) = $FEC7
fcstab(106) = $CC5C
fcstab(107) = $DDD5
fcstab(108) = $A96A
fcstab(109) = $B8E3
fcstab(110) = $8A78
fcstab(111) = $9BF1
fcstab(112) = $7387
fcstab(113) = $620E
fcstab(114) = $5095
fcstab(115) = $411C
fcstab(116) = $35A3
fcstab(117) = $242A
fcstab(118) = $16B1
fcstab(119) = $738
fcstab(120) = $FFCF
fcstab(121) = $EE46
fcstab(122) = $DCDD
fcstab(123) = $CD54
fcstab(124) = $B9EB
fcstab(125) = $A862
fcstab(126) = $9AF9
fcstab(127) = $8B70
fcstab(128) = $8408
fcstab(129) = $9581
fcstab(130) = $A71A
fcstab(131) = $B693
fcstab(132) = $C22C
fcstab(133) = $D3A5
fcstab(134) = $E13E
fcstab(135) = $F0B7
fcstab(136) = $840
fcstab(137) = $19C9
fcstab(138) = $2B52
fcstab(139) = $3ADB
fcstab(140) = $4E64
fcstab(141) = $5FED
fcstab(142) = $6D76
fcstab(143) = $7CFF
fcstab(144) = $9489
fcstab(145) = $8500
fcstab(146) = $B79B
fcstab(147) = $A612
fcstab(148) = $D2AD
fcstab(149) = $C324
fcstab(150) = $F1BF
fcstab(151) = $E036
fcstab(152) = $18C1
fcstab(153) = $948
fcstab(154) = $3BD3
fcstab(155) = $2A5A
fcstab(156) = $5EE5
fcstab(157) = $4F6C
fcstab(158) = $7DF7
fcstab(159) = $6C7E
fcstab(160) = $A50A
fcstab(161) = $B483
fcstab(162) = $8618
fcstab(163) = $9791
fcstab(164) = $E32E
fcstab(165) = $F2A7
fcstab(166) = $C03C
fcstab(167) = $D1B5
fcstab(168) = $2942
fcstab(169) = $38CB
fcstab(170) = $A50
fcstab(171) = $1BD9
fcstab(172) = $6F66
fcstab(173) = $7EEF
fcstab(174) = $4C74
fcstab(175) = $5DFD
fcstab(176) = $B58B
fcstab(177) = $A402
fcstab(178) = $9699
fcstab(179) = $8710
fcstab(180) = $F3AF
fcstab(181) = $E226
fcstab(182) = $D0BD
fcstab(183) = $C134
fcstab(184) = $39C3
fcstab(185) = $284A
fcstab(186) = $1AD1
fcstab(187) = $B58
fcstab(188) = $7FE7
fcstab(189) = $6E6E
fcstab(190) = $5CF5
fcstab(191) = $4D7C
fcstab(192) = $C60C
fcstab(193) = $D785
fcstab(194) = $E51E
fcstab(195) = $F497
fcstab(196) = $8028
fcstab(197) = $91A1
fcstab(198) = $A33A
fcstab(199) = $B2B3
fcstab(200) = $4A44
fcstab(201) = $5BCD
fcstab(202) = $6956
fcstab(203) = $78DF
fcstab(204) = $C60
fcstab(205) = $1DE9
fcstab(206) = $2F72
fcstab(207) = $3EFB
fcstab(208) = $D68D
fcstab(209) = $C704
fcstab(210) = $F59F
fcstab(211) = $E416
fcstab(212) = $90A9
fcstab(213) = $8120
fcstab(214) = $B3BB
fcstab(215) = $A232
fcstab(216) = $5AC5
fcstab(217) = $4B4C
fcstab(218) = $79D7
fcstab(219) = $685E
fcstab(220) = $1CE1
fcstab(221) = $D68
fcstab(222) = $3FF3
fcstab(223) = $2E7A
fcstab(224) = $E70E
fcstab(225) = $F687
fcstab(226) = $C41C
fcstab(227) = $D595
fcstab(228) = $A12A
fcstab(229) = $B0A3
fcstab(230) = $8238
fcstab(231) = $93B1
fcstab(232) = $6B46
fcstab(233) = $7ACF
fcstab(234) = $4854
fcstab(235) = $59DD
fcstab(236) = $2D62
fcstab(237) = $3CEB
fcstab(238) = $E70
fcstab(239) = $1FF9
fcstab(240) = $F78F
fcstab(241) = $E606
fcstab(242) = $D49D
fcstab(243) = $C514
fcstab(244) = $B1AB
fcstab(245) = $A022
fcstab(246) = $92B9
fcstab(247) = $8330
fcstab(248) = $7BC7
fcstab(249) = $6A4E
fcstab(250) = $58D5
fcstab(251) = $495C
fcstab(252) = $3DE3
fcstab(253) = $2C6A
fcstab(254) = $1EF1
fcstab(255) = $F78
; The initial FCS value
fcs = pppinitfcs16
fcs1.l
fcs2.l
fcs3.l
; evaluate the FCS
Endadresse.l=StartAddress+Size-1
For i=StartAddress To EndAdresse
mb=PeekB(i)
fcs1=XOR(mb,fcs)
fcs2=fcs1 & $FF
fcs3=fcstab(fcs2)
fcs4=fcs/$100
fcs=XOR(fcs3,fcs4)
;fcs = (fcs \ &H100&) Xor fcstab((fcs Xor cp(i)) And &HFF&) <-VB-Routine
;MessageRequester("Info",Str(mb)+":"+Str(fcs1)+":"+Str(fcs2)+":"+Str(fcs3)+":"+Str(fcs4),0)
Next
; Return the result
ProcedureReturn fcs
EndProcedure
If ReadFile(0, "c:\test.bmp")
FileLength = Lof()
If FileLength
Startadress=AllocateMemory(0, FileLength , 0)
ReadData(UseMemory(0), FileLength) ; Read the whole file in the memory buffer
Result=CRC16(Startadress,FileLength)
MessageRequester("Info","CRC16 is" + Chr(13) + Str(Result),0)
FreeMemory(0)
EndIf
CloseFile(0)
EndIf
Getting better with a little help from my friends....thx Siggi
;Enable Inline-asm !
;CRC16 Adaption by Siegfried Rings February,5.the 2002
;
;Evalutate the 16-bit CRC (Cyclic Redundancy Checksum) of an MemoryBlock
;
;
; Can be more optimized with pure inline-asm.
Procedure XOR(a,b)
MOV eax,a
XOR eax,b
MOV a,eax
ProcedureReturn a
EndProcedure
Procedure.l CRC16(StartAddress, Size)
i.l
fcs.l
Dim fcstab.l(255)
pppinitfcs16 = $FFFF ;Initial FCS value
; Initialize array once And For all
fcstab(0) = $0
fcstab(1) = $1189
fcstab(2) = $2312
fcstab(3) = $329B
fcstab(4) = $4624
fcstab(5) = $57AD
fcstab(6) = $6536
fcstab(7) = $74BF
fcstab(8) = $8C48
fcstab(9) = $9DC1
fcstab(10) = $AF5A
fcstab(11) = $BED3
fcstab(12) = $CA6C
fcstab(13) = $DBE5
fcstab(14) = $E97E
fcstab(15) = $F8F7
fcstab(16) = $1081
fcstab(17) = $108
fcstab(18) = $3393
fcstab(19) = $221A
fcstab(20) = $56A5
fcstab(21) = $472C
fcstab(22) = $75B7
fcstab(23) = $643E
fcstab(24) = $9CC9
fcstab(25) = $8D40
fcstab(26) = $BFDB
fcstab(27) = $AE52
fcstab(28) = $DAED
fcstab(29) = $CB64
fcstab(30) = $F9FF
fcstab(31) = $E876
fcstab(32) = $2102
fcstab(33) = $308B
fcstab(34) = $210
fcstab(35) = $1399
fcstab(36) = $6726
fcstab(37) = $76AF
fcstab(38) = $4434
fcstab(39) = $55BD
fcstab(40) = $AD4A
fcstab(41) = $BCC3
fcstab(42) = $8E58
fcstab(43) = $9FD1
fcstab(44) = $EB6E
fcstab(45) = $FAE7
fcstab(46) = $C87C
fcstab(47) = $D9F5
fcstab(48) = $3183
fcstab(49) = $200A
fcstab(50) = $1291
fcstab(51) = $318
fcstab(52) = $77A7
fcstab(53) = $662E
fcstab(54) = $54B5
fcstab(55) = $453C
fcstab(56) = $BDCB
fcstab(57) = $AC42
fcstab(58) = $9ED9
fcstab(59) = $8F50
fcstab(60) = $FBEF
fcstab(61) = $EA66
fcstab(62) = $D8FD
fcstab(63) = $C974
fcstab(64) = $4204
fcstab(65) = $538D
fcstab(66) = $6116
fcstab(67) = $709F
fcstab(68) = $420
fcstab(69) = $15A9
fcstab(70) = $2732
fcstab(71) = $36BB
fcstab(72) = $CE4C
fcstab(73) = $DFC5
fcstab(74) = $ED5E
fcstab(75) = $FCD7
fcstab(76) = $8868
fcstab(77) = $99E1
fcstab(78) = $AB7A
fcstab(79) = $BAF3
fcstab(80) = $5285
fcstab(81) = $430C
fcstab(82) = $7197
fcstab(83) = $601E
fcstab(84) = $14A1
fcstab(85) = $528
fcstab(86) = $37B3
fcstab(87) = $263A
fcstab(88) = $DECD
fcstab(89) = $CF44
fcstab(90) = $FDDF
fcstab(91) = $EC56
fcstab(92) = $98E9
fcstab(93) = $8960
fcstab(94) = $BBFB
fcstab(95) = $AA72
fcstab(96) = $6306
fcstab(97) = $728F
fcstab(98) = $4014
fcstab(99) = $519D
fcstab(100) = $2522
fcstab(101) = $34AB
fcstab(102) = $630
fcstab(103) = $17B9
fcstab(104) = $EF4E
fcstab(105) = $FEC7
fcstab(106) = $CC5C
fcstab(107) = $DDD5
fcstab(108) = $A96A
fcstab(109) = $B8E3
fcstab(110) = $8A78
fcstab(111) = $9BF1
fcstab(112) = $7387
fcstab(113) = $620E
fcstab(114) = $5095
fcstab(115) = $411C
fcstab(116) = $35A3
fcstab(117) = $242A
fcstab(118) = $16B1
fcstab(119) = $738
fcstab(120) = $FFCF
fcstab(121) = $EE46
fcstab(122) = $DCDD
fcstab(123) = $CD54
fcstab(124) = $B9EB
fcstab(125) = $A862
fcstab(126) = $9AF9
fcstab(127) = $8B70
fcstab(128) = $8408
fcstab(129) = $9581
fcstab(130) = $A71A
fcstab(131) = $B693
fcstab(132) = $C22C
fcstab(133) = $D3A5
fcstab(134) = $E13E
fcstab(135) = $F0B7
fcstab(136) = $840
fcstab(137) = $19C9
fcstab(138) = $2B52
fcstab(139) = $3ADB
fcstab(140) = $4E64
fcstab(141) = $5FED
fcstab(142) = $6D76
fcstab(143) = $7CFF
fcstab(144) = $9489
fcstab(145) = $8500
fcstab(146) = $B79B
fcstab(147) = $A612
fcstab(148) = $D2AD
fcstab(149) = $C324
fcstab(150) = $F1BF
fcstab(151) = $E036
fcstab(152) = $18C1
fcstab(153) = $948
fcstab(154) = $3BD3
fcstab(155) = $2A5A
fcstab(156) = $5EE5
fcstab(157) = $4F6C
fcstab(158) = $7DF7
fcstab(159) = $6C7E
fcstab(160) = $A50A
fcstab(161) = $B483
fcstab(162) = $8618
fcstab(163) = $9791
fcstab(164) = $E32E
fcstab(165) = $F2A7
fcstab(166) = $C03C
fcstab(167) = $D1B5
fcstab(168) = $2942
fcstab(169) = $38CB
fcstab(170) = $A50
fcstab(171) = $1BD9
fcstab(172) = $6F66
fcstab(173) = $7EEF
fcstab(174) = $4C74
fcstab(175) = $5DFD
fcstab(176) = $B58B
fcstab(177) = $A402
fcstab(178) = $9699
fcstab(179) = $8710
fcstab(180) = $F3AF
fcstab(181) = $E226
fcstab(182) = $D0BD
fcstab(183) = $C134
fcstab(184) = $39C3
fcstab(185) = $284A
fcstab(186) = $1AD1
fcstab(187) = $B58
fcstab(188) = $7FE7
fcstab(189) = $6E6E
fcstab(190) = $5CF5
fcstab(191) = $4D7C
fcstab(192) = $C60C
fcstab(193) = $D785
fcstab(194) = $E51E
fcstab(195) = $F497
fcstab(196) = $8028
fcstab(197) = $91A1
fcstab(198) = $A33A
fcstab(199) = $B2B3
fcstab(200) = $4A44
fcstab(201) = $5BCD
fcstab(202) = $6956
fcstab(203) = $78DF
fcstab(204) = $C60
fcstab(205) = $1DE9
fcstab(206) = $2F72
fcstab(207) = $3EFB
fcstab(208) = $D68D
fcstab(209) = $C704
fcstab(210) = $F59F
fcstab(211) = $E416
fcstab(212) = $90A9
fcstab(213) = $8120
fcstab(214) = $B3BB
fcstab(215) = $A232
fcstab(216) = $5AC5
fcstab(217) = $4B4C
fcstab(218) = $79D7
fcstab(219) = $685E
fcstab(220) = $1CE1
fcstab(221) = $D68
fcstab(222) = $3FF3
fcstab(223) = $2E7A
fcstab(224) = $E70E
fcstab(225) = $F687
fcstab(226) = $C41C
fcstab(227) = $D595
fcstab(228) = $A12A
fcstab(229) = $B0A3
fcstab(230) = $8238
fcstab(231) = $93B1
fcstab(232) = $6B46
fcstab(233) = $7ACF
fcstab(234) = $4854
fcstab(235) = $59DD
fcstab(236) = $2D62
fcstab(237) = $3CEB
fcstab(238) = $E70
fcstab(239) = $1FF9
fcstab(240) = $F78F
fcstab(241) = $E606
fcstab(242) = $D49D
fcstab(243) = $C514
fcstab(244) = $B1AB
fcstab(245) = $A022
fcstab(246) = $92B9
fcstab(247) = $8330
fcstab(248) = $7BC7
fcstab(249) = $6A4E
fcstab(250) = $58D5
fcstab(251) = $495C
fcstab(252) = $3DE3
fcstab(253) = $2C6A
fcstab(254) = $1EF1
fcstab(255) = $F78
; The initial FCS value
fcs = pppinitfcs16
fcs1.l
fcs2.l
fcs3.l
; evaluate the FCS
Endadresse.l=StartAddress+Size-1
For i=StartAddress To EndAdresse
mb=PeekB(i)
fcs1=XOR(mb,fcs)
fcs2=fcs1 & $FF
fcs3=fcstab(fcs2)
fcs4=fcs/$100
fcs=XOR(fcs3,fcs4)
;fcs = (fcs \ &H100&) Xor fcstab((fcs Xor cp(i)) And &HFF&) <-VB-Routine
;MessageRequester("Info",Str(mb)+":"+Str(fcs1)+":"+Str(fcs2)+":"+Str(fcs3)+":"+Str(fcs4),0)
Next
; Return the result
ProcedureReturn fcs
EndProcedure
If ReadFile(0, "c:\test.bmp")
FileLength = Lof()
If FileLength
Startadress=AllocateMemory(0, FileLength , 0)
ReadData(UseMemory(0), FileLength) ; Read the whole file in the memory buffer
Result=CRC16(Startadress,FileLength)
MessageRequester("Info","CRC16 is" + Chr(13) + Str(Result),0)
FreeMemory(0)
EndIf
CloseFile(0)
EndIf
Getting better with a little help from my friends....thx Siggi