задачка - crc16 ccitt на Z80.
Алгоритм такой:
Код:
// Update the CRC for transmitted and received data using
// the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1).
unsigned char ser_data;
static unsigned int crc;
crc = (unsigned char)(crc >> 8) | (crc << 8);
crc ^= ser_data;
crc ^= (unsigned char)(crc & 0xff) >> 4;
crc ^= (crc << 8) << 4;
crc ^= ((crc & 0xff) << 4) << 1;
На асме у меня получилось такое:
Код:
;hl - from
;b - how many
;de - crc value
crc16:
ld de,#ffff
loop:
ld a,d
ld d,e
xor (hl)
inc hl
ld e,a
rrca
rrca
rrca
rrca
and #0f
xor e
ld e,a
rrca
rrca
rrca
ld c,a
rrca
and #f0
xor d
ld d,a
ld a,c
and #1f
xor d
ld d,a
ld a,c
and #e0
xor e
ld e,a
djnz loop
ret
Кто быстрее? Только чур без использования таблиц!... =)
набор тестовых векторов:
Код:
одна латинская буква "A"
0xB915
9 символов "123456789"
0x29B1
256 латинских букв "A" подряд
0xEA0B