PIC 滚动码的解码程序

时间:2008-09-11
     摘要:PIC单片机滚动码的解码程序

  #include <p16f877.inc>
  ;
  global DECRYPT
  global KEY0,KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7
  global CSR0,CSR1,CSR2,CSR3,CSR4,CSR5,CSR6,CSR7,CSR8
  ;
  #define  HOP1 CSR0    ; ﹚竡 HOP1~4 单 CSR1~4
  #define  HOP2 CSR1
  #define  HOP3 CSR2
  #define  HOP4 CSR3
  #define  MAX_CODE_LENGTH .72
  #define  CODE_LENGTH .66
  ;
  UDATA_SHR     ; Difine CSR0:CSR7 on Share memory
  CSR0  res 1      ; Hopping Code 钡Μ纗既竟 (LSB)
  CSR1  res 1
  CSR2  res 1
  CSR3  res 1
  CSR4  res 1
  CSR5  res 1
  CSR6  res 1
  CSR7  res 1
  CSR8  res 1      ; Hopping Code 钡Μ纗既竟 (MSB)
  ;
  Encrypt_Data UDATA 0x20
  KEY0  res 1      ; 64-bit 秆盞じン戈 (LSB)
  KEY1  res 1
  KEY2  res 1
  KEY3  res 1
  KEY4  res 1
  KEY5  res 1
  KEY6  res 1
  KEY7  res 1
  ;
  UDATA
  CNT0  res 1
  CNT1  res 1
  HOP_LENGTH res 1
  MASK  res 1
  KEELOQ_Temp res 1
  ;
  ;
  KEELOQ_CODE CODE
  ;
  ;*****************************************************
  ;**** Rotate CSRs register right 1 bit
  ;*****************************************************
  ROT_CSRs
  RRF  CSR8,F
  RRF     CSR7,F
  RRF     CSR6,F
  RRF     CSR5,F
  RRF     CSR4,F
  RRF     CSR3,F
  RRF     CSR2,F
  RRF     CSR1,F
  RRF     CSR0,F
  return
  ;
  ;
  ;
  ;
  ;****************************************************************
  ;
  ; FUNCTION      : DECRYPT ()
  ;
  ; DESCRIPTION   : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
  ;
  ;****************************************************************
  DECRYPT
  BANKSEL CNT1
  MOVLW   (.11+1)         ; OUTER LOOP 11+1 TIMES
  MOVWF   CNT1           ; OUTER LOOP 11+1 TIMES
  DECRYPT_OUTER
  MOVLW   .48             ; INNER LOOP 48 TIMES
  MOVWF   CNT0           ; INNER LOOP 48 TIMES
  DECRYPT_INNER
  CLRWDT     ; RESET WATCHDOG TIMER
  MOVFW   CNT1   ; LAST 48 LOOPS RESTORE THE KEY
  XORLW   .1              ; LAST 48 LOOPS RESTORE THE KEY
  btfsc STATUS,Z        ; LAST 48 LOOPS RESTORE THE KEY
  GOTO    ROTATE_KEY      ; LAST 48 LOOPS RESTORE THE KEY
  ; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE
  ; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK
  ; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE
  ; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE
  ; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE
  ; LOOKUP REQUIRES AN ADDITIONAL STACK LEVEL
  bcf STATUS,C         ; CLEAR CARRY (FOR THE LEFT SHIFT)
  MOVLW   .1              ; INITIALISE MASK = 1
  BTFSC   HOP3,3        ; SHIFT MASK 4X IF BIT 2 SET
  MOVLW   B'00010000'     ; SHIFT MASK 4X IF BIT 2 SET
  MOVWF   MASK            ; INITIALISE MASK = 1
  BTFSS   HOP2,0        ; SHIFT MASK ANOTHER 2X IF BIT 1 SET
  GOTO    $+3
  RLF     MASK,F
  RLF     MASK,F
  BTFSC   HOP1,0        ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
  RLF     MASK,F
  ; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0
  MOVlw HIGH TABLE
  MOVwf PCLATH
  MOVlw LOW TABLE
  MOVwf KEELOQ_Temp
  MOVLW   0               ; TABLE INDEX = 0
  BTFSC   HOP4,1
  IORLW   .2              ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX
  BTFSC   HOP4,6
  IORLW   .4              ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX
  addwf KEELOQ_Temp,W
  btfsc STATUS,C
  incf PCLATH,F
  MOVwf PCL            ; ADD THE INDEX TO THE PROGRAM COUNTER
  ;  [ MUST BE IN LOWER HALF OF PAGE ]
  TABLE
  MOVLW   0x2E            ; BITS 4:3 WERE 00
  GOTO    TABLE_END       ; END OF LOOKUP
  MOVLW   0x74            ; BITS 4:3 WERE 01
  GOTO    TABLE_END       ; END OF LOOKUP
  MOVLW   0x5C            ; BITS 4:3 WERE 10
  GOTO    TABLE_END       ; END OF LOOKUP
  MOVLW   0x3A            ; BITS 4:3 WERE 11
  TABLE_END
  ANDWF   MASK,1          ; ISOLATE THE CORRECT BIT
  MOVLW   0               ; COPY THE BIT TO BIT 7
  btfss STATUS,Z        ; COPY THE BIT TO BIT 7
  MOVLW   B'10000000'     ; COPY THE BIT TO BIT 7
  XORWF   HOP2,W      ; ONLY INTERESTED IN BIT HOP2,7
  XORWF   HOP4,W      ; ONLY INTERESTED IN BIT HOP4,7
  XORWF   KEY1,W   ; ONLY INTERESTED IN BIT KEYREG1,7
  MOVWF   MASK            ; STORE W TEMPORARILY (WE NEED BIT 7)
  RLF     MASK,F          ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY
  RLF     HOP1,F          ; SHIFT IN THE NEW BIT
  RLF     HOP2,F
  RLF     HOP3,F
  RLF     HOP4,F
  ROTATE_KEY
  bcf STATUS,C   ; CLEAR CARRY
  BTFSC   KEY7,7        ; SET CARRY IF LEFTMOST BIT SET
  bsf STATUS,C         ; SET CARRY IF LEFTMOST BIT SET
  RLF     KEY0,F          ; LEFT-ROTATE THE 64-BIT KEY
  RLF     KEY1,F
  RLF     KEY2,F
  RLF     KEY3,F
  RLF     KEY4,F
  RLF     KEY5,F
  RLF     KEY6,F
  RLF     KEY7,F
  DECFSZ  CNT0,F          ; INNER LOOP 48 TIMES
  GOTO    DECRYPT_INNER   ; INNER LOOP 48 TIMES
  DECFSZ  CNT1,F          ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
  GOTO    DECRYPT_OUTER   ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
  RETLW   0               ; RETURN
   



  
上一篇:EDK工具中硬件平台
下一篇:EDK工具自定义IP核

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料