?? p676_koq.asm
字號:
;------------------------------------------------------------------------------
; MICROCHIP KEELOQ CODE HOPPING SIMPLE DECODER
;
;------------------------------------------------------------------------------
; LEGAL NOTICE
;
; The information contained in this document is proprietary and
; confidential information of Microchip Technology Inc. Therefore all
; parties are required to sign a non-disclosure agreement before
; receiving this document.
;------------------------------------------------------------------------------
;===========================================================================
; SIMPLE DECODER WITH ONE STEP LEARN AND SINGLE KEY
;===========================================================================
;
;PROGRAM INFORMATION: FILE: SIMDEC10.ASM
; DATE: 08/15/96
; VER.: 1.0
; CKSM: XXXXH - FUSES:RC,WDT=ON,CP=ON
; ASM.: MPASM VERSION 1.40 USED
; INCL: NONE
; TABS: 8
;===========================================================================
; CONFIGURATION CONTROL:
;
; DATE VERSION LINE CHANGES
; 08/14/96 1.0 FIRST VERSION
;===========================================================================
INCLUDE<P16F676.INC>
LIST P=PIC16F676,R=DEC
;===========================================================================
;******USER DEFINITIONS******
MAX_USERS EQU 15
; This is the maximum number of transmitters that the system is able to
; learn (1 to 15).
;===========================================================================
; USER DEFINED REGISTER
FLAGS EQU 20H ; USER FLAG REGISTER
ADDRESS EQU 21H ; ADDRESS REGISTER
TXNUM EQU 22H ; CURRENT TX
OUTBYT EQU 23H ; GENERAL DATA REGISTER
MASK EQU OUTBYT ; MASK REGISTER USED IN DECRYPTION
TMP_CNT EQU OUTBYT ; TEMPORARY COUNTER
; COUNTER REGISTERS
CNT0 EQU 24H ; LOOP COUNTERS
CNT1 EQU 25H
CNT2 EQU 26H
CNT_HI EQU 27H ; 16 BIT CLOCK COUNTER
CNT_LW EQU 28H
; CIRCULAR BUFFER REGISTER
CSR0 EQU 29H ; 64 BIT RECEIVE SHIFT REGISTER
CSR1 EQU 2AH
CSR2 EQU 2BH
CSR3 EQU 2CH
CSR4 EQU 2DH
CSR5 EQU 2EH
CSR6 EQU 2FH
CSR7 EQU 30H
; TEMP REGISTERS
TMP1 EQU 31H ; TEMP REGISTER FOR READ AND WRITE
TMP2 EQU 32H ; TEMP REGISTER FOR READ AND WRITE
ADDRESS1 EQU 33H ; NOT USED
COUNT_ERASE EQU 34H ; NOT USED
KEY0 EQU 35H ; 64 BIT KEY SHIFT REGISTER
KEY1 EQU 36H
KEY2 EQU 37H
KEY3 EQU 38H
KEY4 EQU CNT2
KEY5 EQU CSR5
KEY6 EQU CSR6
KEY7 EQU CSR7
DATAS EQU 39H
; ***** USER REGISTER RE-MAPPINGS ***************
HOP1 EQU CSR0 ; 32 BIT HOPCODE REGISTER
HOP2 EQU CSR1
HOP3 EQU CSR2
HOP4 EQU CSR3
; RECEIVED TRANSMISSION OPEN 32 BITS
SER_0 EQU CSR7 ; 28 BIT SERIAL NUMBER
SER_1 EQU CSR6
SER_2 EQU CSR5
SER_3 EQU CSR4
; RECEIVED TRANSMISSION ENCRYPTED 32 BITS
FUNC EQU CSR3 ; BUTTON CODE & USER BIT FUNCTION BYTE
CODEE EQU CSR2 ; DISCRIMINATION VALUE
CNTR_HI EQU CSR1 ; 16 BIT RX COUNTER HIGH BYTE
CNTR_LW EQU CSR0 ; 16 BIT RX COUNTER LOW BYTE
; ********* EEPROM MEMORY *******
LRNPTR EQU 02H ; LEARN POINTER
; ********* PORTA BIT DEFINITIONS *******
LED EQU 0H ; RESERVED PIN
RFIN EQU 1H ; RF INPUT
LRN EQU 2H ; LEARN BUTTON
RES0 EQU 3H ; LEARN INDICATOR LED OUTPUT - VALID SIGNAL
; ********* PORTC BIT DEFINITIONS *******
S0 EQU 0H ; S0 OUTPUT
S1 EQU 1H ; S1 OUTPUT
S2 EQU 2H ; S2 OUTPUT
S3 EQU 3H ; S3 OUTPUT
DIO EQU 4H ; EEPROM DATA LINE
CLK EQU 5H ; EEPROM SERIAL CLOCK
CS EQU 6H ; EEPROM CHIP SELECT
RES1 EQU 7H ; RESERVED PIN
; ********* COMPILER DEFINES ******************
NBITS EQU 64 ; MAXIMUM TRANSMISSION BIT LENGTH
MIN EQU 560 ; TRANSMISSION HEADER MINIMUM LENGTH [鍿]
TRIS_A EQU 001110B ; PORTA: TRI-STATE VALUE
WRCFG EQU 00000000B ; PORTC: EEPROM WRITE TRI-STATE VALUE
RDCFG EQU 00000000B ; PORTC: EEPROM READ TRI-STATE VALUE
;****** FLAGS DEFINITIONS **************
BITIN EQU 0H ; RF BIT VALUE
LRNF EQU 1H ; LEARN FLAG
SEC_CNT EQU 2H ; SECOND COUNTER IS BEING CHECKED
RELEARN EQU 3H ; RELEARNING A TRANSMITTER
;****** STATUS REGISTER BIT DEFINITIONS *****************
C EQU 0 ; CARRY
DC EQU 1 ; DIGIT CARRY
Z EQU 2 ; ZERO
PD EQU 3 ; POWER DOWN
TO EQU 4 ; TIMEOUT
PA0 EQU 5 ; NOT USED
PA1 EQU 6 ; NOT USED
flash_flags equ 40h
;===========================================================================
; PAGE 0:
;===========================================================================
ORG 00H
;===========================================================================
;
; FUNCTION : RESET ()
;
; DESCRIPTION : PROGRAM RESET ROUTINE
;
;===========================================================================
RESET
BSF STATUS,RP0 ;calibrating the internal oscillator
MOVLW 07H ;setting option
MOVWF OPTION_REG
MOVLW TRIS_A ;setting TRIS_A
MOVWF TRISA
MOVWF IOCA ;setting IOCA
MOVLW 00h ;setting trisC
MOVWF TRISC
MOVLW 34H ;setting wpua
MOVWF WPUA
MOVLW 00H
MOVWF INTCON ;setting intcon
CLRF ANSEL ;setting along/digital pin
;<80H REG SETTING
BCF STATUS,RP0
MOVLW 07H ;setting cmcon
MOVWF CMCON
CLRF PORTA ; RESET PORTA
CLRF PORTC ; RESET PORTC
CLRF FLAGS ; RESET FLAGS
GOTO M_LOOP ; GOTO MAIN PROGRAM LOOP
;===========================================================================
;
; FUNCTION : ROT_SHIFT()
;
; DESCRIPTION : RIGHT ROTATE 64 BIT RECEIVE SHIFT REGISTER
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
ROT_SHIFT
RRF CSR7,F
RRF CSR6,F
RRF CSR5,F
RRF CSR4,F
RRF CSR3,F
RRF CSR2,F
RRF CSR1,F
RRF CSR0,F
RETLW 0
;===========================================================================
;
; FUNCTION : TX_LOOKUP ()
;
; DESCRIPTION : TRANSMITTER ADDRESS CALCULATION
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
TX_LOOKUP
MOVF TXNUM,W ; USE TRANSMITTER NUMBER TO CALCULATE
MOVWF ADDRESS ; ADDRESS OF TRANSMITER BLOCK
CLRC ; MULTIPLY BY 4
RLF ADDRESS,F
RLF ADDRESS,F
MOVLW 04H ; AND ADD 4
ADDWF ADDRESS,F
RETLW 0 ; RETURN
;===========================================================================
;
; FUNCTION : TST_RTCC ()
;
; DESCRIPTION : UPDATE RTCC COUNTER
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
TST_RTCC
CLRWDT ; RESET WATCHDOG TIMER
BSF STATUS,RP0
MOVLW TRIS_A ; UPDATE TRI-STATE REGISTER FOR PORTA
MOVLW TRISA
BCF STATUS,RP0
BTFSS TMR0,7 ; TEST FOR 32MS TIMEOUT ON RTCC MSB
RETLW 0 ; ... DO QUICK RETURN TO RECEIVE ROUTINE
; **** INCREASE 16 BIT CLOCK TIMER *******
BCF TMR0,7 ; CLEAR MSB OF RTCC
INCF CNT_LW,F ; INCREASE 16 COUNTER
SKPNZ ; INCREASE UPPER BYTE IF ZERO ( OVERFLOW )
INCF CNT_HI,F
RETLW 0
;===========================================================================
;
; FUNCTION : TST_TIMER()
;
; DESCRIPTION : TEST 32MS TIMER AND UPDATE OUTPUTS IF REQUIRED
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
TST_TIMER
; ***** TEST FOR 500 MS TIMEMOUT ON OUTPUTS **********
BTFSS CNT_LW,6 ; TEST FOR 500 MS TIMEOUT
GOTO TST_30 ; ... IF NOT TEST 30S TIMEOUT
MOVFW PORTC
BTFSS STATUS,Z
COMF PORTC ; DOWN ALL PULSE OUTPUTS
clrf CNT_LW
; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30
BTFSS FLAGS,LRNF
GOTO TST_END
BTFSC CNT_HI,2 ; TEST FOR LEARN TIMEOUT
GOTO RESET ; ... IF LEARN TIMEMOUT FORCE SOFT RESET
TST_END
RETLW 0H
;===========================================================================
;
; FUNCTION : EEWRITE ()
;
; DESCRIPTION : WRITE 16 BIT VALUE TO EEPROM
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
EEWRITE
CLRWDT
MOVFW ADDRESS
MOVWF ADDRESS1
RLF ADDRESS1
MOVFW TMP1
MOVWF DATAS
MOVLW 02H
MOVWF CNT1
EEWRITE1
BSF STATUS,RP0
MOVF ADDRESS1,W
MOVWF EEADR
MOVF DATAS,W
MOVWF EEDATA
BSF EECON1,WREN
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRIT_VERIFY
CLRWDT
BTFSC EECON1,WR
GOTO $-2
MOVF EEDATA,W
BSF EECON1,RD
XORWF EEDATA,W
BTFSS STATUS,Z
GOTO EEWRITE1
BCF STATUS,RP0
DECFSZ CNT1
GOTO EEWRITE2
INCF ADDRESS
RETLW 0H
EEWRITE2
MOVFW TMP2
MOVWF DATAS
INCF ADDRESS1
GOTO EEWRITE1
;===========================================================================
;
; FUNCTION : EEREAD ()
;
; DESCRIPTION : READ 16 BIT VALUE FROM EEPROM
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
EEREAD
CLRWDT
MOVFW ADDRESS
MOVWF ADDRESS1
RLF ADDRESS1
MOVLW 02H
MOVWF CNT1
EEREAD3
MOVFW ADDRESS1
BSF STATUS,RP0
MOVWF EEADR
BSF EECON1,RD
MOVF EEDATA,W
BCF STATUS,RP0
BTFSS CNT1,1
GOTO EEREAD4
MOVWF TMP1
EEREAD1
DECFSZ CNT1
GOTO EEREAD2
CLRWDT
RETLW 0H
EEREAD2
INCF ADDRESS1
GOTO EEREAD3
EEREAD4
MOVWF TMP2
GOTO EEREAD1
;===========================================================================
;
; FUNCTION : DECRYPT ()
;
; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;===========================================================================
; THE KEY USED IS A FIXED KEY WHICH IS NOT SERIAL NUMBER DEPENDANT
; THE USER MUST CHOOSE A KEY AND CHANGE THE CODE HERE TO REFLECT THAT KEY
DECRYPT
MOVLW 0EFH ; LOAD FIXED 64 BIT KEY LSB
MOVWF KEY0
MOVLW 0CDH
MOVWF KEY1
MOVLW 0ABH
MOVWF KEY2
MOVLW 089H
MOVWF KEY3
MOVLW 067H
MOVWF KEY4
MOVLW 045H
MOVWF KEY5
MOVLW 023H
MOVWF KEY6
MOVLW 01H ; LOAD FIXED 64 BIT KEY MSB
MOVWF KEY7
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
SKPNZ ; 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
CLRC ; CLEAR CARRY (FOR THE LEFT SHIFT)
MOVLW 1 ; INITIALISE MASK = 1
BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET
MOVLW 10000B ; 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 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 PCL,F ; ADD THE INDEX TO THE PROGRAM COUNTER
; [ MUST BE IN LOWER HALF OF PAGE ]
TABLE
MOVLW 02EH ; BITS 4:3 WERE 00
GOTO TABLE_END ; END OF LOOKUP
MOVLW 074H ; BITS 4:3 WERE 01
GOTO TABLE_END ; END OF LOOKUP
MOVLW 05CH ; BITS 4:3 WERE 10
GOTO TABLE_END ; END OF LOOKUP
MOVLW 03AH ; BITS 4:3 WERE 11
TABLE_END
ANDWF MASK,F ; ISOLATE THE CORRECT BIT BY ANDING WITH MASK
MOVLW 0 ; COPY THE BIT TO BIT 7
SKPZ ; COPY THE BIT TO BIT 7
MOVLW 10000000B ; 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 THE CARRY
RLF HOP1,F ; SHIFT IN THE NEW BIT
RLF HOP2,F
RLF HOP3,F
RLF HOP4,F
ROTATE_KEY
CLRC ; CLEAR CARRY
BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET
SETC ; 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
;===========================================================================
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -