  Базовая заготовка библиотек для обработки
 CRC7/CRC8 по алгоритму микроLAN согласно
  требования MAXIM-DALLAS .
  
   для микроконтроллеров группы MCS51
   использовать механизм переключения регистровых банков
   для работы с набором "затираемых" регистров
   исключение - регистр флагов должен находится
   в поле регистров с прямоадресуемыми битами
   как указатель массива используется R0/R1

;---------------------------------------
;     константы/флаги

crc_el_f  equ 0 ; флаг ошибки в запросе (нет ответа датчика)
crc_ec_f  equ 1 ; флаг ошибки в CRC (актуально для crc_k7/crc_k8)
crc_g_f   equ 2 ; завершение программы в режиме генератора CRC

;     регистры
используется текущий активный регистровый банк
 ( при необходимости требуется хранить содержимое занимаемых
 под обработчик регистров в стеке
 при условии вызова как простейшей подпрограммы ОБЯЗаТЕЛЬНО
 хранение акумулятора и PSW в стеке )
crc_ptr = R0  указатель адреса текущего байта в массиве
crc_cntb = R2 счетчик бит текущего байта
crc_cntw = R3 счетчик байт к обработке
crc_dat = R5  текущий обрабатываемый байт
crc_sum = R7  накопитель результата
crc_flg  любой свободный в области 0x20-0x2F
 регистр флагов обработчика (доступ из других программ!)
;   буфер данных
; (требует предварительного заполнения в соответствии с задачей)
bloknot предпочтение в области 0x30-0x3F
     как вариант в области 0xF0-0xFF при косвенной адресации
     исключительно через @Ri для МК группы 52 и выше (ОЗУ 256 байт)
     
; макрос вызова (если необходимо)

ld_crc_ptr macro point
    mov r0,#point
  endm

; собственно прожка
; вызывается как подпрограмма вида acall adr/lcall adr
; блок данных предварительно размещается в point РПД
; используется R7,R5,R3,R2 и R0 текущего регистрового банка

 crc_g7:
   mov R3,#7
   sjmp crcg_bs
 crc_g8:
   mov R3,#8
 crcg_bs:
   setb crc_flg.crc_g_f
   sjmp crck
 crc_k7:
   mov R3,#8
   sjmp crcg_bc
 crc_k8:
   mov R3,#9
 crcg_bc:
   clr crc_flg.crc_g_f
 crck:
     clr crc_flg.crc_ec_f
     clr a
     mov r7,a
; mov r0,#mlans выполнено в макросе вызова
 crcl:
     mov a,@r0
     mov r5,a
     mov r2,#8
 crclp:
      xrl a,r7
      rrc a
      mov a,r7
      jnc zero_m
      xrl a,#0x18
 zero_m:
      rrc a
      mov r7,a
      mov a,r5
      rr a
      mov r5,a
     djnz r2,crclp
    inc r0
   djnz r3,crcl
  jbc crc_flg.crc_g_f,crc_gend ; если режим генерации идти в crc_gend
   clr a ; при использовании конструкции на базе cjne затруднение
   add a,r7 ; в случае операций со стеком
   jz wcrc ; если CRC правильна в накопителе 0
   setb crc_flg.crc_ec_f
 wcrc:
   ret
crc_gend:
     mov a,r7
    mov @r0,a
   ret
;
