16bit CRC for SC62015

YMを開発したときに作った16bit CRC計算ルーチンです。
テーブルを使ったものと使わないものの2パターンあります。
テーブル使用のものはサイズが大きいけれど高速。
テーブルを使用しないものはサイズは小さいけれど若干低速。

非商用利用であれば自由に使用して構いません。


テーブル使用版

内部RAMを2バイト使用します。

crc:    equ    0
	mv		x, buf
	mv		i, 128
	call	crc_calc
	retf
;
;----------------------------------------------------------
;
; 16bit CRC 計算ルーチン
;
;引数
; X : 対象となるデータの先頭アドレス
; I : データサイズ
;破壊レジスタ
; Y, BA
crc_calc:
    mvw     (crc), 0         ;CRC初期化(内部RAM)
crc1:
    mv      a, [x++]
    mv      y, crctbl
    xor     a, (crc+1)
    add     y, a
    add     y, a
    mv      ba, [y]
    xor     a, (crc)
    ex      a, b
    mv      (crc), ba
    dec     i
    jrnz    crc1
    ret
crctbl:
    db  000h, 000h, 010h, 021h, 020h, 042h, 030h, 063h
    db  040h, 084h, 050h, 0a5h, 060h, 0c6h, 070h, 0e7h
    db  081h, 008h, 091h, 029h, 0a1h, 04ah, 0b1h, 06bh
    db  0c1h, 08ch, 0d1h, 0adh, 0e1h, 0ceh, 0f1h, 0efh
    db  012h, 031h, 002h, 010h, 032h, 073h, 022h, 052h
    db  052h, 0b5h, 042h, 094h, 072h, 0f7h, 062h, 0d6h
    db  093h, 039h, 083h, 018h, 0b3h, 07bh, 0a3h, 05ah
    db  0d3h, 0bdh, 0c3h, 09ch, 0f3h, 0ffh, 0e3h, 0deh
    db  024h, 062h, 034h, 043h, 004h, 020h, 014h, 001h
    db  064h, 0e6h, 074h, 0c7h, 044h, 0a4h, 054h, 085h
    db  0a5h, 06ah, 0b5h, 04bh, 085h, 028h, 095h, 009h
    db  0e5h, 0eeh, 0f5h, 0cfh, 0c5h, 0ach, 0d5h, 08dh
    db  036h, 053h, 026h, 072h, 016h, 011h, 006h, 030h
    db  076h, 0d7h, 066h, 0f6h, 056h, 095h, 046h, 0b4h
    db  0b7h, 05bh, 0a7h, 07ah, 097h, 019h, 087h, 038h
    db  0f7h, 0dfh, 0e7h, 0feh, 0d7h, 09dh, 0c7h, 0bch
    db  048h, 0c4h, 058h, 0e5h, 068h, 086h, 078h, 0a7h
    db  008h, 040h, 018h, 061h, 028h, 002h, 038h, 023h
    db  0c9h, 0cch, 0d9h, 0edh, 0e9h, 08eh, 0f9h, 0afh
    db  089h, 048h, 099h, 069h, 0a9h, 00ah, 0b9h, 02bh
    db  05ah, 0f5h, 04ah, 0d4h, 07ah, 0b7h, 06ah, 096h
    db  01ah, 071h, 00ah, 050h, 03ah, 033h, 02ah, 012h
    db  0dbh, 0fdh, 0cbh, 0dch, 0fbh, 0bfh, 0ebh, 09eh
    db  09bh, 079h, 08bh, 058h, 0bbh, 03bh, 0abh, 01ah
    db  06ch, 0a6h, 07ch, 087h, 04ch, 0e4h, 05ch, 0c5h
    db  02ch, 022h, 03ch, 003h, 00ch, 060h, 01ch, 041h
    db  0edh, 0aeh, 0fdh, 08fh, 0cdh, 0ech, 0ddh, 0cdh
    db  0adh, 02ah, 0bdh, 00bh, 08dh, 068h, 09dh, 049h
    db  07eh, 097h, 06eh, 0b6h, 05eh, 0d5h, 04eh, 0f4h
    db  03eh, 013h, 02eh, 032h, 01eh, 051h, 00eh, 070h
    db  0ffh, 09fh, 0efh, 0beh, 0dfh, 0ddh, 0cfh, 0fch
    db  0bfh, 01bh, 0afh, 03ah, 09fh, 059h, 08fh, 078h
    db  091h, 088h, 081h, 0a9h, 0b1h, 0cah, 0a1h, 0ebh
    db  0d1h, 00ch, 0c1h, 02dh, 0f1h, 04eh, 0e1h, 06fh
    db  010h, 080h, 000h, 0a1h, 030h, 0c2h, 020h, 0e3h
    db  050h, 004h, 040h, 025h, 070h, 046h, 060h, 067h
    db  083h, 0b9h, 093h, 098h, 0a3h, 0fbh, 0b3h, 0dah
    db  0c3h, 03dh, 0d3h, 01ch, 0e3h, 07fh, 0f3h, 05eh
    db  002h, 0b1h, 012h, 090h, 022h, 0f3h, 032h, 0d2h
    db  042h, 035h, 052h, 014h, 062h, 077h, 072h, 056h
    db  0b5h, 0eah, 0a5h, 0cbh, 095h, 0a8h, 085h, 089h
    db  0f5h, 06eh, 0e5h, 04fh, 0d5h, 02ch, 0c5h, 00dh
    db  034h, 0e2h, 024h, 0c3h, 014h, 0a0h, 004h, 081h
    db  074h, 066h, 064h, 047h, 054h, 024h, 044h, 005h
    db  0a7h, 0dbh, 0b7h, 0fah, 087h, 099h, 097h, 0b8h
    db  0e7h, 05fh, 0f7h, 07eh, 0c7h, 01dh, 0d7h, 03ch
    db  026h, 0d3h, 036h, 0f2h, 006h, 091h, 016h, 0b0h
    db  066h, 057h, 076h, 076h, 046h, 015h, 056h, 034h
    db  0d9h, 04ch, 0c9h, 06dh, 0f9h, 00eh, 0e9h, 02fh
    db  099h, 0c8h, 089h, 0e9h, 0b9h, 08ah, 0a9h, 0abh
    db  058h, 044h, 048h, 065h, 078h, 006h, 068h, 027h
    db  018h, 0c0h, 008h, 0e1h, 038h, 082h, 028h, 0a3h
    db  0cbh, 07dh, 0dbh, 05ch, 0ebh, 03fh, 0fbh, 01eh
    db  08bh, 0f9h, 09bh, 0d8h, 0abh, 0bbh, 0bbh, 09ah
    db  04ah, 075h, 05ah, 054h, 06ah, 037h, 07ah, 016h
    db  00ah, 0f1h, 01ah, 0d0h, 02ah, 0b3h, 03ah, 092h
    db  0fdh, 02eh, 0edh, 00fh, 0ddh, 06ch, 0cdh, 04dh
    db  0bdh, 0aah, 0adh, 08bh, 09dh, 0e8h, 08dh, 0c9h
    db  07ch, 026h, 06ch, 007h, 05ch, 064h, 04ch, 045h
    db  03ch, 0a2h, 02ch, 083h, 01ch, 0e0h, 00ch, 0c1h
    db  0efh, 01fh, 0ffh, 03eh, 0cfh, 05dh, 0dfh, 07ch
    db  0afh, 09bh, 0bfh, 0bah, 08fh, 0d9h, 09fh, 0f8h
    db  06eh, 017h, 07eh, 036h, 04eh, 055h, 05eh, 074h
    db  02eh, 093h, 03eh, 0b2h, 00eh, 0d1h, 01eh, 0f0h
;---------------------------------------------------------
;

buf:	ds	128

テーブルを使用しない版

内部RAMを2バイト使用します。

crc:        equ     0
    mv      x, buf
    mv      i, 128
    call    crc_calc
    retf
;
;----------------------------------------------------------
;
; 16bit CRC 計算ルーチン
;
;引数
; X : 対象となるデータの先頭アドレス
; I : データサイズ
;破壊レジスタ
; A
crc_calc:
    mvw     (crc), 0         ;CRC初期化(内部RAM)
crc1:
    mv      a, [x++]
    xor     (crc+1), a
    pushu   i
    mv      il, 8
crc2:
    rc
    shl     (crc)
    shl     (crc+1)
    jrnc    crc3
    xor     (crc), 21h
    xor     (crc+1), 10h
crc3:
    dec     il
    jrnz    crc2
    popu    i
    dec     i
    jrnz    crc1
    ret
;----------------------------------------------------------
;
buf:        ds   128

戻る