задачка - 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