I dont know how much u know about crc ing but pretty much all it does is XOR a sectionbyte by byte or word by word....(etc.)  to ensure that it does not change
normally in the following fashion of somesort
/************************************
 * This C code snippet Wont show u what an    *
 * asm code will look like but will let understand *
 * the theory behind it... I hope                      *
 ***********************************/
int i=0;
char *SectionToBeChecked;
char GoodCheck = WhateverIsValueOfGoodCheck;
char XORValue = 0;
/************************************
 * iterate through the section Byte by Byte
 * XOR'ing the value of each byte with the
 * current XORValue variable and storing it there
 * so any one different byte should change the
 * final value of the variable
 ***********************************/
while(i<LengthOfSection)
{
     XORValue^=SectionToBeChecked[i++];
}
/* test the variable agianst the good */
if(XORValue == GoodCheck) // passed the CRC
else /* DOH!!!!!!!! But Ma-arge! */
anyway... find a tiny loop that is just XOR-ing a String and you should have found a CRC procedure
then u got all sorts of ways to fix your problem

 gl hope i helped