функцию для расчёта crc16.
Код
;***************************************************************************
; (c) 1998 Alexander Trush Http://troosh.pp.ru
;
; Function UpdateCRC for computing CRC16 (poly 0x1021)
;
; Вы можете свободно использовать, распространять, модифицировать этот
; код до тех пор, пока вы указываете моё авторство и распространяете
; это требование. Кроме того, я хотел бы получать уведомление о
; применении этого кода по e-mail (troosh (at) kbotd : ru).
CRC_H: .BYTE 1; CRC accum
CRC_L: .BYTE 1
.DEF HL_5 = r14
.DEF HH_5 = r16; High Only
.DEF H_1 = r15
.DEF H_12 = r17; High Only
UpdateCRC: lds H_12, CRC_H
mov H_1, H_12
swap H_12
mov HH_5, H_12
eor H_12, H_1
andi H_12, 0xF0
andi HH_5, 0x0F
eor H_1, HH_5
mov HL_5, H_12
lsl HL_5
rol HH_5
eor H_1, HL_5
eor H_12, HH_5
lds HL_5, CRC_L
eor H_1, ZH
eor H_12, HL_5
sts CRC_L, H_1
sts CRC_H, H_12
ret
; (c) 1998 Alexander Trush Http://troosh.pp.ru
;
; Function UpdateCRC for computing CRC16 (poly 0x1021)
;
; Вы можете свободно использовать, распространять, модифицировать этот
; код до тех пор, пока вы указываете моё авторство и распространяете
; это требование. Кроме того, я хотел бы получать уведомление о
; применении этого кода по e-mail (troosh (at) kbotd : ru).
CRC_H: .BYTE 1; CRC accum
CRC_L: .BYTE 1
.DEF HL_5 = r14
.DEF HH_5 = r16; High Only
.DEF H_1 = r15
.DEF H_12 = r17; High Only
UpdateCRC: lds H_12, CRC_H
mov H_1, H_12
swap H_12
mov HH_5, H_12
eor H_12, H_1
andi H_12, 0xF0
andi HH_5, 0x0F
eor H_1, HH_5
mov HL_5, H_12
lsl HL_5
rol HH_5
eor H_1, HL_5
eor H_12, HH_5
lds HL_5, CRC_L
eor H_1, ZH
eor H_12, HL_5
sts CRC_L, H_1
sts CRC_H, H_12
ret
Попытался сравнить её по производительности с идущей в комплекте с WinAvr (понятно что полином другой).
Код
/*
* Optimized CRC-16 calculation.
*
* Polynomial: x^16 + x^15 + x^2 + 1 (0xa001)
* Initial value: 0xffff
*/
static __inline__ uint16_t
_crc16_update(uint16_t __crc, uint8_t __data)
{
uint8_t __tmp;
uint16_t __ret;
__asm__ __volatile__ (
"eor %A0,%2" "\n\t"
"mov %1,%A0" "\n\t"
"swap %1" "\n\t"
"eor %1,%A0" "\n\t"
"mov __tmp_reg__,%1" "\n\t"
"lsr %1" "\n\t"
"lsr %1" "\n\t"
"eor %1,__tmp_reg__" "\n\t"
"mov __tmp_reg__,%1" "\n\t"
"lsr %1" "\n\t"
"eor %1,__tmp_reg__" "\n\t"
"andi %1,0x07" "\n\t"
"mov __tmp_reg__,%A0" "\n\t"
"mov %A0,%B0" "\n\t"
"lsr %1" "\n\t"
"ror __tmp_reg__" "\n\t"
"ror %1" "\n\t"
"mov %B0,__tmp_reg__" "\n\t"
"eor %A0,%1" "\n\t"
"lsr __tmp_reg__" "\n\t"
"ror %1" "\n\t"
"eor %B0,__tmp_reg__" "\n\t"
"eor %A0,%1"
: "=r" (__ret), "=d" (__tmp)
: "r" (__data), "0" (__crc)
: "r0"
);
return __ret;
}
И понял, что не хватает ни времени ни мозгов на это.* Optimized CRC-16 calculation.
*
* Polynomial: x^16 + x^15 + x^2 + 1 (0xa001)
* Initial value: 0xffff
*/
static __inline__ uint16_t
_crc16_update(uint16_t __crc, uint8_t __data)
{
uint8_t __tmp;
uint16_t __ret;
__asm__ __volatile__ (
"eor %A0,%2" "\n\t"
"mov %1,%A0" "\n\t"
"swap %1" "\n\t"
"eor %1,%A0" "\n\t"
"mov __tmp_reg__,%1" "\n\t"
"lsr %1" "\n\t"
"lsr %1" "\n\t"
"eor %1,__tmp_reg__" "\n\t"
"mov __tmp_reg__,%1" "\n\t"
"lsr %1" "\n\t"
"eor %1,__tmp_reg__" "\n\t"
"andi %1,0x07" "\n\t"
"mov __tmp_reg__,%A0" "\n\t"
"mov %A0,%B0" "\n\t"
"lsr %1" "\n\t"
"ror __tmp_reg__" "\n\t"
"ror %1" "\n\t"
"mov %B0,__tmp_reg__" "\n\t"
"eor %A0,%1" "\n\t"
"lsr __tmp_reg__" "\n\t"
"ror %1" "\n\t"
"eor %B0,__tmp_reg__" "\n\t"
"eor %A0,%1"
: "=r" (__ret), "=d" (__tmp)
: "r" (__data), "0" (__crc)
: "r0"
);
return __ret;
}
Для желающих потренировать извилины - добро пожаловать
