Скорость: не более 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;
}