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