- Расчет контрольной суммы CRC-16 CCITT с полиномом 0x8408 на PDP-11
-
? TheGWBV@ - 01.02.2016 04:49
/*
Name : CRC-16 CCITT
Poly : 0x8408
Init : 0xFFFF
Revert: false
XorOut: 0x0000
Check : 0x6F91 ("123456789")
MaxLen: 4095 байт (32767 бит) - обнаружение
одинарных, двойных, тройных и всех нечетных ошибок
*/
unsigned short crc_ccitt_update (unsigned short crc, unsigned char data){
¤
// R0 == data
// R1 == crc
// MOV R3,-(SP)
// MOV R2,-(SP)
unsigned short t;
¤
data ^= crc&255;
// bcrc = crc MOV R1,R2
// bcrc = bcrc & 255 BIC #177400,R2
// data = data XOR bcrc XOR R2,R0
¤
data ^= data << 4;
// MOV R0,R2
// chrdata = data << 4 ROLB R2
ROLB R2
ROLB R2
ROLB R2
// data = data XOR chrdata XOR R2,R0
¤
t = (((unsigned short)data << 8) | ((crc>>8)&255));
// chrdata = data
// shtdata = chrdata MOV R0,R2
// shtdata = shtdata << 8 SWAB R2
// tempcrc = crc >> 8 SWAB R1
// tempcrc = tempcrc & 255 BIC #177400,R1
// t = tempcrc OR shtdata BIS R2,R1
¤
t ^= (unsigned char)(data >> 4);
// chrdata = data MOV R0,R2
// chrdata = chrdata >> 4 RORB R2
RORB R2
RORB R2
RORB R2
// t = t XOR chrdata XOR R2,R1
¤
t ^= ((unsigned short)data << 3);
// chrdata = data MOV R0,R2
// shtdata = chrdata ROL R2
// shtdata = shtdata << 3 ROL R2
ROL R2
// t = t XOR shtdata XOR R2,R1
// MOV (SP)+,R2
// MOV (SP)+,R3
return t; // crc == R1 RET
}
-
? Patron - 01.02.2016 13:26
SWAB R1
BIC #177400,R1
Можно заменить на
CLRB R1
SWAB R1
-
? TheGWBV@ - 01.02.2016 19:54
Ага, спасибо!
-
? Дмитрий - 01.02.2016 20:17
MOV R3,-(SP) + MOV (SP)+,R3 убрать - нигде не используется R3
-
? TheGWBV@ - 01.02.2016 20:41
Точно, спасибо!
-
? Дмитрий - 02.02.2016 10:17
Это кусок алгоритма - обновление текущей crc одним элементом. Нет использования полинома в коде/нет таблицы, нет перебора массива.
- << Форум