asm-51 (keil)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Sot 13 июля 2004 г. 17:09
В ответ на: Алгоритм вычисления контрольной суммы отправлено AlexanderKr 13 июля 2004 г. 17:04


$INCLUDE (REG51.INC)


NAME CRC8


?PR?_crc8?CRC8 SEGMENT CODE

PUBLIC _crc8


; =============================================================================
; = Вычисление CRC-8 (X^8 + X^5 + X^4 + 1) заданного блока памяти =
; = ------------------------------------------------------------------------- =
; = Вход: R3/R2/R1 - начальный адpес блока, =
; = R5 - его размер в байтах =
; = Выход: R7 - вычисленная контрольная сумма =
; =============================================================================
; unsigned char crc8(void* buf, char num) {

RSEG ?PR?_crc8?CRC8
USING 0

_crc8:
MOV DPH,R2 ; Начальный адрес блока для XDATA
MOV DPL,R1 ;

MOV R7,#0 ; Сбросить контрольную сумму

?0001:
MOV R6,#8 ; Число сдвигов

MOV A,R3 ; Определить сегмент памяти блока,
JNZ ?0002 ; разрешен IDATA(0x00) и XDATA(0x01)

MOV A,@R1 ; Текущий байт (*this) в IDATA
SJMP ?0003 ;

?0002:
MOVX A,@DPTR ; Текущий байт (*this) в XDATA

?0003:
MOV R4,A ; Сохранить его

XRL A,R7 ; if(!(*this ^ crc8 & 1)) goto ?0004
RRC A ;
MOV A,R7 ;
JNC ?0004 ;

XRL A,#018h ; crc8 = ((crc8 ^ 0x18) >> 1) | 0x80

?0004:
RRC A ; crc8 = (crc8 >> 1) & ~0x80
MOV R7,A ;

MOV A,R4 ; *this >>= 1
RR A ;

DJNZ R6,?0003 ; Расчитать СRC текущего байта

INC R1 ; Перейти к следующему байту (IDATA)
INC DPTR ; Перейти к следующему байту (XDATA)

DJNZ R5,?0001 ; Расчитать СRC всего блока

; }
RET


END


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru