CRCTABL:LDI XH,$01
CLR XL
CLR R16
LDI R17,$05
LDI R18,$80
CRCT0: LDI R19,8
CLR R14
CLR R15
CRCTT1: LSL R14
ROL R15
ROL R16
BRCC T2
EOR R14,R17
EOR R15,R18
CRCTT2: DEC R19
BRNE CRCT1
ST X+,R14
ST X+,R15
INC R16
BRNE CRCT0
RET
首先“ BRCC T2 ”没找到T2这个标号,估计是CRCTT2,就当它是CRCTT2
从你程序的标号来看,这很像是冗余校验码表生成函数,$8005像是CRC16的生成多项式:11000000000000101
从这两点看,是为CRC16查表作准备用的。
程序的可读性一般,我觉得这样写可读性比较好(当然本人水平有限):
首先,在数据段应该
.DATA
CRC16_TABLE:
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
其次在代码段
;----------------------------------------------------------------------------
CRC16_TABLE_GEN: ;CRC16表生成子程序
.EQU CRC16_GEN_POLY = $8005
LDI XH,HIGH(CRC16_TABLE)
LDI XL, LOW(CRC16_TABLE)
CLR R16
LDI R17,LOW(CRC16_GEN_POLY)
LDI R18,HIGH(CRC16_GEN_POLY)
CRC16_TABLE_GEN_FOR_BYTES_LOOP: ;循环生成表码
LDI R19,8
CLR R14
CLR R15
CRC16_TABLE_GEN_EACH_BYTE_LOOP: ;每字节的循环
LSL R14
ROL R15
ROL R16
BRCC CRC16_TABLE_GEN_BIT_ZERO ;非1则转
EOR R14,R17
EOR R15,R18
CRC16_TABLE_GEN_BIT_ZERO:
DEC R19
BRNE CRC16_TABLE_GEN_EACH_BYTE_LOOP ;每字节的循环结束判断
ST X+,R14
ST X+,R15
INC R16
BRNE CRC16_TABLE_GEN_FOR_BYTES_LOOP ;是否生成完毕
RET |