[SDCC] табличный CRC32
Posted: Sun, 15.04.2018 10:47:11
- Code: Select all
unsigned long crc32_table[256];
/**************************************************************
* Calculate ZIP CRC32 table
* Polynome: 0xEDB88320
*************************************************************/
void crc32_init(unsigned long *crc32_table)
{
unsigned int i, j;
unsigned long crc;
for (i=0; i<256; i++)
{
crc = i;
for (j=0; j<8; j++)
crc = crc & 1 ? (crc>>1)^0xEDB88320 : crc>>1;
crc32_table[i] = crc;
}
}
/**************************************************************
* Calculate ZIP CRC32
* Init value: 0xFFFFFFFF
* XOROut: 0xFFFFFFFF
*************************************************************/
unsigned long calc_crc32t(unsigned long init_crc, unsigned char *data, unsigned int size) __naked
{
init_crc;
data;
size;
__asm
push ix
push iy
pop af
pop af
pop af
pop hl
pop de ; DEHL = initial CRC
pop ix ; IX = data ptr
pop bc ; BC = size
push bc
push ix
push de
push hl
push af
exx
ld de,#_crc32_table
ld c,#0
exx
//crc = crc32_table[(crc ^ *buf++) & 0x000000FF] ^ (crc >> 8);
crc32_lp$:
ld a,0 (ix)
xor l ; (crc ^ *buf++) & 0x000000FF
exx
ld l,a
ld h,c
add hl,hl
add hl,hl
add hl,de
ld a,l
.db 0xFD
ld l,a
ld a,h
.db 0xFD
ld h,a
exx
ld a,0 (iy)
xor h
ld l,a
ld a,1 (iy)
xor e
ld h,a
ld a,2 (iy)
xor d
ld e,a
ld d,3 (iy)
inc ix
dec bc
ld a,b
or c
jp nz,crc32_lp$
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
pop iy
pop ix
ret
__endasm;
}