CRC-32, CRC-32/JAMCRC

Программирование, алгоритмы

Postby amixgris » Fri, 13.04.2018 23:33:18

Вычисление CRC-32 (СRC-32/JAMCRC) с таблицей из 8 полиномов.
Скорость: не более 1800 тактов на байт.
Размер: 181 байт.
Если убрать строки после ld de,(#ulCRC+2) и до ret, функция вернёт значение СRC-32/JAMCRC, иначе - СRC-32

Code: Select all
unsigned long Gris_crc32(unsigned char* data, unsigned int len) __naked {
__asm

   pop   af
   pop   hl   ; data ptr
   pop bc   ; len
   push   bc
   push   hl
   push   af

   ld   de,#0xffff
   ld   (ulCRC),de
   ld   (ulCRC+2),de
   ld   (#text_ptr),hl

loop:
   push   bc

   ld   de,#ulCRC
   ld   a,(de)
   inc   de
   ld   hl,(#text_ptr)
   xor   (hl)
   inc   hl
   ld   (#text_ptr),hl
   ld   c,a
    ld  hl,#crc32table
   ld   a,(de)
   call   3$
   ld   a,(de)
   call   3$
   ld   a,(de)
   call   3$
   xor a
   call   3$

   pop   bc
   dec   bc
   ld   a,b
   or   c
   jr   nz,loop
   
   ld  hl,(#ulCRC)
   ld  de,(#ulCRC+2)
   ld  a,l
   cpl
   ld  l,a
   ld  a,h
   cpl
   ld  h,a
   ld  a,e
   cpl
   ld  e,a
   ld  a,d
   cpl
   ld  d,a
    ret

3$:   ld   b,#8
1$:   rrc   c
   jr   nc,2$
   xor   (hl)
2$:   inc   hl
   djnz   1$
   dec de
   ld   (de),a
   inc   de
   inc de
   ret

text_ptr:
   .dw   0
crc32table:
   .db   0x96, 0x2C, 0x19, 0x32 ,0x64 ,0xC8 ,0x90 ,0x20
   .db   0x30, 0x61, 0xC4, 0x88, 0x10, 0x20, 0x41, 0x83
   .db   0x07, 0x0E, 0x6D, 0xDB, 0xB7, 0x6E, 0xDC, 0xB8
   .db   0x77, 0xEE, 0x07, 0x0E, 0x1D, 0x3B, 0x76, 0xED
ulCRC: ;big endien
   .db   0,0,0,0
__endasm;
}

Last edited by amixgris on Sun, 15.04.2018 18:35:57, edited 1 time in total.
User avatar
amixgris
 
Posts: 161
Joined: Mon, 30.07.2012 03:22:48
LOCATION: Самара

Postby dr_max » Sun, 15.04.2018 10:38:11

Отличная альтернатива между решением в "лоб" сдвигами и табличным методом!!!
dr_max
 
Posts: 82
Joined: Thu, 26.01.2017 12:03:36


Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

x