您的位置:首页单片机PIC单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

PIC单片机滚动码汇编解码程序

[日期:2008-07-03 ] [来源:net 作者:佚名] [字体: (投递新闻)

#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

阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐