4 /* CRCを含めたデータサイズ(バッファサイズ) */
5 uint8_t CalcCRC(uint8_t *pData, uint8_t
DataSize) {
6 register uint8_t *pCRC = pData + DataSize -1;
7 register uint8_t dat;
8 int i;
9
10 if
(!*pCRC) { DataSize--; }
11
12 for (i
= 0; i < DataSize; i++) {
13 dat =
pData[i];
14
15 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
16 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
17 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
18 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
19 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
20 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
21 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
22 *pCRC
= ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC
>> 1); dat >>= 1;
23 }
24 }
ROMコードであれば8バイトのバッファとバッファ長8を渡します
バッファはファミリコードが0バイト目 CRCが7バイト目になるような配列です
CRCが0の場合はCRCを生成し
CRCが0以外の場合はCRCを再計算します
CRCを生成する条件で読んだ場合はCRCの部分にCRCデータが入りますが
CRCを再計算する条件の場合は0になれば正常です 0以外の場合はCRCデータを含めいずれかの1つ以上のビットが破壊されています
上の*pCRC = ((dat ^...のコードはforで回すべきですが
今回は8回分ベタ書きしています
この最適化がどれくらいに効果があるかは不明ですが とりあえず気分の問題ってことで
0 件のコメント:
コメントを投稿