89 lines
1.5 KiB
ArmAsm
89 lines
1.5 KiB
ArmAsm
; Fast table-based CRC-32
|
|
|
|
.define crc_tables (bss+$FF)&$FF00 ; 256-byte aligned
|
|
.redefine bss crc_tables+$400
|
|
|
|
|
|
; Initializes fast CRC tables and resets checksum.
|
|
; Time: 47 msec
|
|
init_crc_fast:
|
|
ld l,0
|
|
@next:
|
|
xor a
|
|
ld c,a
|
|
ld d,a
|
|
ld e,l
|
|
|
|
ld h,8
|
|
- rra
|
|
rr c
|
|
rr d
|
|
rr e
|
|
jr nc,+
|
|
xor $ED
|
|
ld b,a
|
|
ld a,c
|
|
xor $B8
|
|
ld c,a
|
|
ld a,d
|
|
xor $83
|
|
ld d,a
|
|
ld a,e
|
|
xor $20
|
|
ld e,a
|
|
ld a,b
|
|
|
|
+ dec h
|
|
jr nz,-
|
|
|
|
ld h,>crc_tables
|
|
ld (hl),e
|
|
inc h
|
|
ld (hl),d
|
|
inc h
|
|
ld (hl),c
|
|
inc h
|
|
ld (hl),a
|
|
|
|
inc l
|
|
jr nz,@next
|
|
|
|
jp init_crc
|
|
|
|
|
|
; Faster version of update_crc
|
|
; Preserved: BC, DE
|
|
; Time: 50 cycles (including CALL)
|
|
update_crc_fast:
|
|
|
|
; Fastest inline macro version of update_crc_fast
|
|
; Time: 40 cycles
|
|
; Size: 28 bytes
|
|
.macro update_crc_fast
|
|
ld l,a ; 1
|
|
lda checksum ; 3
|
|
xor l ; 1
|
|
ld l,a ; 1
|
|
ld h,>crc_tables ; 2
|
|
|
|
lda checksum+1 ; 3
|
|
xor (hl) ; 2
|
|
inc h ; 1
|
|
sta checksum ; 3
|
|
|
|
lda checksum+2 ; 3
|
|
xor (hl) ; 2
|
|
inc h ; 1
|
|
sta checksum+1 ; 3
|
|
|
|
lda checksum+3 ; 3
|
|
xor (hl) ; 2
|
|
inc h ; 1
|
|
sta checksum+2 ; 3
|
|
|
|
ld a,(hl) ; 2
|
|
sta checksum+3 ; 3
|
|
.endm
|
|
update_crc_fast
|
|
ret
|