作者WolfLord (呆呆小狼)
看板ASM
標題[贈碼] ASM CRC16 For Keil C51
時間Tue Apr 26 23:31:26 2011
C宣告:
extern unsigned char data CRCH;
extern unsigned char data CRCL;
#define resetCRC16() {CRCH=0;CRCL=0;}
extern char caCRC16(char c);
ASM:
NAME CRC16_ASM51
CDCRC16_ASM51 SEGMENT CODE
DACRC16_ASM51 SEGMENT DATA
PUBLIC caCRC16
PUBLIC CRCH
PUBLIC CRCL
;-----------------------------------
RSEG DACRC16_ASM51
CRCH: DS 1
CRCL: DS 1
;-----------------------------------
RSEG CDCRC16_ASM51
caCRC16:
_caCRC16:
MOV A,R7
PUSH ACC
XRL A,CRCL
MOV CRCL,CRCH
MOV CRCH,A
MOV C,P
JNC CRCF0
XRL CRCL,#001H
CRCF0:
RRC A
JNC CRCF1
XRL CRCL,#040H
CRCF1:
MOV C,ACC.7
XRL A,CRCH
RRC A
MOV CRCH,A
JNC CRCF2
XRL CRCL,#080H
CRCF2:
POP ACC
RET
;-----------------------------------
;-----------------------------------
END
使用說明:
先RESET掉CRC16的兩個答案REGISTER
然後把要算的東西統統逐字用caCRC()丟進去,然後從 CRCH跟CRCL兩個暫
存變數取得CRC。
著作權宣告:
Wolflord 保留著作權,但無償開放給PTT ASM 板板友自由修改、使用。
免責聲明:
本程式碼無償開放給不特定對象使用,程式作者不擔保任何因使用本程式
碼導致的任何瑕疵或損失。
--
作別人不願作的事,是好人!。 作別人不敢作的事,是壞人!。
作別人不能作的事,是天才!。 作別人不會作的事,是…腦殘!!
WolfLord
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.46.218.248
→ WolfLord:有想搞CRC的人可以參考修改...CRC可以有不同種子不同算法 04/26 23:41
→ WolfLord:所以使用的人可以自己修改城自己想要的狀態 04/26 23:41
→ ksmrt0123:crc那有什麼種子? polynomial吧 04/27 01:58
推 ruemann:推 04/27 10:55
推 waynecone:感謝大大~拜讀中... 04/27 10:58
→ WolfLord:KS:起始除數 ,這就會造成明明是CRC,但是答案不一樣 :P 04/27 20:39
推 shawnwang:推~ 04/28 01:12
→ ksmrt0123:w大... 不要害新手啊~ 把polynomial講清楚才是啊~ 04/28 01:22
→ ksmrt0123:舉例來說好了, 今天要實作 CRC-16-DECT (無線電話用的) 04/28 02:09
→ ksmrt0123:其polynomial是 x^16+x^10+x^8+x^7+x^3+1, 程式怎麼改? 04/28 02:11
→ WolfLord:這個程式是高度卡諾圖化的,想改polynomial需要重劃卡諾 04/28 05:12
→ WolfLord:圖,然後修改TEST BIT的部份 :P 04/28 05:12
→ WolfLord:其實也不難,只是須要頭腦冷靜清楚的去化布林就是了 :P 04/28 05:15
→ ksmrt0123: :P 04/28 20:44
推 ruemann:一般用半查表算是比較折衷的做法.... 04/29 00:54
→ WolfLord:這是向MCU壓榨CODE SIZE的藝術啊~~(倒) 04/29 01:14