;CRC CCITT 0x1021 - left shift ("normal bit order"), "direct" algorithm ;several different implementations, plus a simple and stupid test ;(C)2007 by Jan Waclawek - wek at efton dot sk ; ;attempt to modify it to "kermit", according to http://www.lammertbies.nl/comm/info/crc-calculation.html ; see also http://reveng.sourceforge.net/crc-catalogue/16.htm ; the difference to above is, that "kermit" shifts to the right, with mirrored poly (ie 0x8408) ; second difference is that it starts with 0x0000 ; (alternatively, it might be performed on the very same algo as above, with mirroring input data and the result) ;mods to the original (C)2016 by Jan Waclawek - wek at efton dot sk ;oh, and a licence, sort of ;free (both in beer and freedom) for personal use ;for commercial use contact me DSEG AT 30h CRCLo: DS 1 CRCHi: DS 1 CSEG TestCRCk: mov dptr,#TestCRCkData ;calculate CRC of itself, check after each byte mov CRCHi,#0h mov CRCLo,#0h TestCRCkLoop: push dph push dpl clr a movc a,@a+dptr call CRCkNib pop dpl pop dph inc dptr mov a,dpl cjne a,#LOW(TestCRCkEnd),TestCRCkLoop mov a,dph cjne a,#HIGH(TestCRCkEnd),TestCRCkLoop TestCRCkOK: sjmp TestCRCkOK CRCkNib: ;20 cyc xrl a,CRCLo mov CRCLo,a anl a,#0Fh swap a xrl CRCLo,a rr a xrl a,CRCHi xch a,CRCLo mov CRCHi,a anl a,#0F0h swap a xrl CRCLo,a clr c rrc a xrl CRCHi,a clr a rrc a xrl CRCLo,a ret TestCRCkData: db '123456789' TestCRCkEnd: END ; this was the original one TestCRC: mov dptr,#TestCRC ;calculate CRC of itself, check after each byte mov CRCHi,#0FFh mov CRCLo,#0FFh TestCRCLoop: push dph push dpl clr a movc a,@a+dptr push CRCLo push CRCHi push acc call CRCNib pop acc pop dph pop dpl push dpl push dph push acc push CRCLo push CRCHi mov CRCLo,dpl mov CRCHi,dph call CRCTab pop acc cjne a,CRCHi,TestCRCError pop acc cjne a,CRCLo,TestCRCError pop acc pop dph pop dpl push CRCLo push CRCHi mov CRCLo,dpl mov CRCHi,dph call CRC3 pop acc cjne a,CRCHi,TestCRCError pop acc cjne a,CRCLo,TestCRCError pop dpl pop dph inc dptr mov a,dpl cjne a,#LOW(TestCRCEnd),TestCRCLoop mov a,dph cjne a,#HIGH(TestCRCEnd),TestCRCLoop TestCRCOK: sjmp TestCRCOK TestCRCError: ljmp TestCRCError ;---------- ;CRCNib: ;22 cyc, uses B ; xrl a,CRCHi ; mov CRCHi,a ; anl a,#0F0h ; mov b,a ; swap a ; xrl CRCHi,a ; rl a ; xrl a,CRCLo ; xch a,CRCHi ; anl a,#0Fh ; orl b,a ; swap a ; xrl CRCHi,a ; add a,acc ; xrl b,a ; clr a ; rlc a ; xrl CRCHi,a ; mov CRCLo,b ; ret CRCNib: ;19 cyc xrl a,CRCHi mov CRCHi,a anl a,#0F0h swap a xrl CRCHi,a rl a xrl a,CRCLo xch a,CRCHi mov CRCLo,a anl a,#0Fh swap a xrl CRCHi,a add a,acc xrl CRCLo,a clr a rlc a xrl CRCHi,a ret ;---------- CRC3: ;18 cyc, uses R0 mov r0,#CRCHi xrl a,@r0 mov @r0,a swap a xrl a,@r0 xchd a,@r0 anl a,#0F0h xrl CRCLo,a add a,acc xrl CRCLo,a xrl a,@r0 xch a,CRCLo xch a,@r0 swap a rlc a xrl CRCHi,a ret ;---------- CRCTabOld: ;19-20 cyc (average 19.5) xrl a,CRCHi mov dptr,#TableOld clr c rlc a jnc CCC1 inc dph CCC1: mov CRCHi,a movc a,@a+dptr xrl a,CRCLo xch a,CRCHi inc dptr movc a,@a+dptr mov CRCLo,a ret TableOld: dw 00000h, 01021h, 02042h, 03063h, 04084h, 050a5h, 060c6h, 070e7h dw 08108h, 09129h, 0a14ah, 0b16bh, 0c18ch, 0d1adh, 0e1ceh, 0f1efh dw 01231h, 00210h, 03273h, 02252h, 052b5h, 04294h, 072f7h, 062d6h dw 09339h, 08318h, 0b37bh, 0a35ah, 0d3bdh, 0c39ch, 0f3ffh, 0e3deh dw 02462h, 03443h, 00420h, 01401h, 064e6h, 074c7h, 044a4h, 05485h dw 0a56ah, 0b54bh, 08528h, 09509h, 0e5eeh, 0f5cfh, 0c5ach, 0d58dh dw 03653h, 02672h, 01611h, 00630h, 076d7h, 066f6h, 05695h, 046b4h dw 0b75bh, 0a77ah, 09719h, 08738h, 0f7dfh, 0e7feh, 0d79dh, 0c7bch dw 048c4h, 058e5h, 06886h, 078a7h, 00840h, 01861h, 02802h, 03823h dw 0c9cch, 0d9edh, 0e98eh, 0f9afh, 08948h, 09969h, 0a90ah, 0b92bh dw 05af5h, 04ad4h, 07ab7h, 06a96h, 01a71h, 00a50h, 03a33h, 02a12h dw 0dbfdh, 0cbdch, 0fbbfh, 0eb9eh, 09b79h, 08b58h, 0bb3bh, 0ab1ah dw 06ca6h, 07c87h, 04ce4h, 05cc5h, 02c22h, 03c03h, 00c60h, 01c41h dw 0edaeh, 0fd8fh, 0cdech, 0ddcdh, 0ad2ah, 0bd0bh, 08d68h, 09d49h dw 07e97h, 06eb6h, 05ed5h, 04ef4h, 03e13h, 02e32h, 01e51h, 00e70h dw 0ff9fh, 0efbeh, 0dfddh, 0cffch, 0bf1bh, 0af3ah, 09f59h, 08f78h dw 09188h, 081a9h, 0b1cah, 0a1ebh, 0d10ch, 0c12dh, 0f14eh, 0e16fh dw 01080h, 000a1h, 030c2h, 020e3h, 05004h, 04025h, 07046h, 06067h dw 083b9h, 09398h, 0a3fbh, 0b3dah, 0c33dh, 0d31ch, 0e37fh, 0f35eh dw 002b1h, 01290h, 022f3h, 032d2h, 04235h, 05214h, 06277h, 07256h dw 0b5eah, 0a5cbh, 095a8h, 08589h, 0f56eh, 0e54fh, 0d52ch, 0c50dh dw 034e2h, 024c3h, 014a0h, 00481h, 07466h, 06447h, 05424h, 04405h dw 0a7dbh, 0b7fah, 08799h, 097b8h, 0e75fh, 0f77eh, 0c71dh, 0d73ch dw 026d3h, 036f2h, 00691h, 016b0h, 06657h, 07676h, 04615h, 05634h dw 0d94ch, 0c96dh, 0f90eh, 0e92fh, 099c8h, 089e9h, 0b98ah, 0a9abh dw 05844h, 04865h, 07806h, 06827h, 018c0h, 008e1h, 03882h, 028a3h dw 0cb7dh, 0db5ch, 0eb3fh, 0fb1eh, 08bf9h, 09bd8h, 0abbbh, 0bb9ah dw 04a75h, 05a54h, 06a37h, 07a16h, 00af1h, 01ad0h, 02ab3h, 03a92h dw 0fd2eh, 0ed0fh, 0dd6ch, 0cd4dh, 0bdaah, 0ad8bh, 09de8h, 08dc9h dw 07c26h, 06c07h, 05c64h, 04c45h, 03ca2h, 02c83h, 01ce0h, 00cc1h dw 0ef1fh, 0ff3eh, 0cf5dh, 0df7ch, 0af9bh, 0bfbah, 08fd9h, 09ff8h dw 06e17h, 07e36h, 04e55h, 05e74h, 02e93h, 03eb2h, 00ed1h, 01ef0h ;---------- CRCTab: ;14 cyc xrl a,CRCHi mov CRCHi,a mov dptr,#Table movc a,@a+dptr xrl a,CRCLo xch a,CRCHi inc dph movc a,@a+dptr mov CRCLo,a ret Table: ;high db 000h, 010h, 020h, 030h, 040h, 050h, 060h, 070h db 081h, 091h, 0a1h, 0b1h, 0c1h, 0d1h, 0e1h, 0f1h db 012h, 002h, 032h, 022h, 052h, 042h, 072h, 062h db 093h, 083h, 0b3h, 0a3h, 0d3h, 0c3h, 0f3h, 0e3h db 024h, 034h, 004h, 014h, 064h, 074h, 044h, 054h db 0a5h, 0b5h, 085h, 095h, 0e5h, 0f5h, 0c5h, 0d5h db 036h, 026h, 016h, 006h, 076h, 066h, 056h, 046h db 0b7h, 0a7h, 097h, 087h, 0f7h, 0e7h, 0d7h, 0c7h db 048h, 058h, 068h, 078h, 008h, 018h, 028h, 038h db 0c9h, 0d9h, 0e9h, 0f9h, 089h, 099h, 0a9h, 0b9h db 05ah, 04ah, 07ah, 06ah, 01ah, 00ah, 03ah, 02ah db 0dbh, 0cbh, 0fbh, 0ebh, 09bh, 08bh, 0bbh, 0abh db 06ch, 07ch, 04ch, 05ch, 02ch, 03ch, 00ch, 01ch db 0edh, 0fdh, 0cdh, 0ddh, 0adh, 0bdh, 08dh, 09dh db 07eh, 06eh, 05eh, 04eh, 03eh, 02eh, 01eh, 00eh db 0ffh, 0efh, 0dfh, 0cfh, 0bfh, 0afh, 09fh, 08fh db 091h, 081h, 0b1h, 0a1h, 0d1h, 0c1h, 0f1h, 0e1h db 010h, 000h, 030h, 020h, 050h, 040h, 070h, 060h db 083h, 093h, 0a3h, 0b3h, 0c3h, 0d3h, 0e3h, 0f3h db 002h, 012h, 022h, 032h, 042h, 052h, 062h, 072h db 0b5h, 0a5h, 095h, 085h, 0f5h, 0e5h, 0d5h, 0c5h db 034h, 024h, 014h, 004h, 074h, 064h, 054h, 044h db 0a7h, 0b7h, 087h, 097h, 0e7h, 0f7h, 0c7h, 0d7h db 026h, 036h, 006h, 016h, 066h, 076h, 046h, 056h db 0d9h, 0c9h, 0f9h, 0e9h, 099h, 089h, 0b9h, 0a9h db 058h, 048h, 078h, 068h, 018h, 008h, 038h, 028h db 0cbh, 0dbh, 0ebh, 0fbh, 08bh, 09bh, 0abh, 0bbh db 04ah, 05ah, 06ah, 07ah, 00ah, 01ah, 02ah, 03ah db 0fdh, 0edh, 0ddh, 0cdh, 0bdh, 0adh, 09dh, 08dh db 07ch, 06ch, 05ch, 04ch, 03ch, 02ch, 01ch, 00ch db 0efh, 0ffh, 0cfh, 0dfh, 0afh, 0bfh, 08fh, 09fh db 06eh, 07eh, 04eh, 05eh, 02eh, 03eh, 00eh, 01eh ;low db 000h, 021h, 042h, 063h, 084h, 0a5h, 0c6h, 0e7h db 008h, 029h, 04ah, 06bh, 08ch, 0adh, 0ceh, 0efh db 031h, 010h, 073h, 052h, 0b5h, 094h, 0f7h, 0d6h db 039h, 018h, 07bh, 05ah, 0bdh, 09ch, 0ffh, 0deh db 062h, 043h, 020h, 001h, 0e6h, 0c7h, 0a4h, 085h db 06ah, 04bh, 028h, 009h, 0eeh, 0cfh, 0ach, 08dh db 053h, 072h, 011h, 030h, 0d7h, 0f6h, 095h, 0b4h db 05bh, 07ah, 019h, 038h, 0dfh, 0feh, 09dh, 0bch db 0c4h, 0e5h, 086h, 0a7h, 040h, 061h, 002h, 023h db 0cch, 0edh, 08eh, 0afh, 048h, 069h, 00ah, 02bh db 0f5h, 0d4h, 0b7h, 096h, 071h, 050h, 033h, 012h db 0fdh, 0dch, 0bfh, 09eh, 079h, 058h, 03bh, 01ah db 0a6h, 087h, 0e4h, 0c5h, 022h, 003h, 060h, 041h db 0aeh, 08fh, 0ech, 0cdh, 02ah, 00bh, 068h, 049h db 097h, 0b6h, 0d5h, 0f4h, 013h, 032h, 051h, 070h db 09fh, 0beh, 0ddh, 0fch, 01bh, 03ah, 059h, 078h db 088h, 0a9h, 0cah, 0ebh, 00ch, 02dh, 04eh, 06fh db 080h, 0a1h, 0c2h, 0e3h, 004h, 025h, 046h, 067h db 0b9h, 098h, 0fbh, 0dah, 03dh, 01ch, 07fh, 05eh db 0b1h, 090h, 0f3h, 0d2h, 035h, 014h, 077h, 056h db 0eah, 0cbh, 0a8h, 089h, 06eh, 04fh, 02ch, 00dh db 0e2h, 0c3h, 0a0h, 081h, 066h, 047h, 024h, 005h db 0dbh, 0fah, 099h, 0b8h, 05fh, 07eh, 01dh, 03ch db 0d3h, 0f2h, 091h, 0b0h, 057h, 076h, 015h, 034h db 04ch, 06dh, 00eh, 02fh, 0c8h, 0e9h, 08ah, 0abh db 044h, 065h, 006h, 027h, 0c0h, 0e1h, 082h, 0a3h db 07dh, 05ch, 03fh, 01eh, 0f9h, 0d8h, 0bbh, 09ah db 075h, 054h, 037h, 016h, 0f1h, 0d0h, 0b3h, 092h db 02eh, 00fh, 06ch, 04dh, 0aah, 08bh, 0e8h, 0c9h db 026h, 007h, 064h, 045h, 0a2h, 083h, 0e0h, 0c1h db 01fh, 03eh, 05dh, 07ch, 09bh, 0bah, 0d9h, 0f8h db 017h, 036h, 055h, 074h, 093h, 0b2h, 0d1h, 0f0h TestCRCEnd: end