📄 secsys14.asm
字号:
TST_LEARN5
BTFSC FLAGS,PASS1
GOTO TST_LEARN7 ; ALREADY IN LEARN
MOVLW 2
SUBWF CNT_LW,W
BTFSC STATUS,CARRY
GOTO TST_LEARN6 ; TEST IF LEARN PRESS LONGER THAN 64 MS
MOVLW ARMEDS ; CHECK IF IN ARMED STATE
XORWF RAMS,W
BTFSC STATUS,ZERO ; ... NO, CONTINUE
BSF FLAGS,LFLASH ; RESET FLASH FLAG
BCF PORTB,LED
RETLW 0 ; ... IF NOT ABORT LEARN
TST_LEARN6
BSF FLAGS,PASS1 ; INDICATE FIRST STATE OF LEARN
BCF FLAGS,NORMAL ; INDICATE FIRST STATE OF LEARN
BCF FLAGS,PASS2
BCF FLAGS1,S_RSTR ; FLAGS MUST NOT BE RESTORED
TST_LEARN7
BSF PORTB,LED ; LED ON TO INDICATE LEARN ACTIVATED
RETLW 0H
;**************************************************************************
;
; FUNCTION : SENDC ()
;
; DESCRIPTION : SEND EEPROM COMMAND
;
; PAGE : 0
;
;**************************************************************************
SENDC1
CLRWDT ; RESET WATCHDOG TIMER
BCF PORTA,CS ; RESET CS STATE
BCF PORTA,CLK ; RESET CLK STATE
BCF PORTA,DIO ; RESET DIO STATE
MOVLW WRCFG
TRIS PORTA ; DIO = OUTPUT
GOTO $+1 ; WAIT FOR OUTPUTS TO SETTLE
BSF PORTA,CS ; SELECT EEPROM
SETC ; START BIT = 1
MOVLW 9D ; START BIT + 8 DATA BITS
MOVWF CNT1
SENDC2
BTFSS STATUS,CARRY ; TEST BIT
BCF PORTA,DIO ; WRITE TO DIO
BTFSC STATUS,CARRY ; TEST BIT
BSF PORTA,DIO ; WRITE TO DIO
GOTO $+1 ; WAIT 2 US
RLF OUTBYT,F ; GET NEXT BIT INTO CARRY
BSF PORTA,CLK ; CLOCK HIGH
GOTO $+1 ; WAIT 2 US
GOTO $+1 ; WAIT 2 US
BCF PORTA,CLK ; CLOCK LOW
DECFSZ CNT1,F ; LOOP COUNTER
GOTO SENDC2
BCF PORTA,DIO ; AVOID CONTENTION WITH READ
RETLW 0
;**************************************************************************
;
; FUNCTION : EEWRITE ()
;
; DESCRIPTION : ENCRYPT AND WRITE 16 BIT VALUE TO EEPROM
;
; PAGE : 0
;
;**************************************************************************
EEWRITE
; ****** ENCRYPT 16-BIT WORD TO WRITE TO EEPROM ***************
FNC
MOVLW 16D ; 16 DATA BITS TO ENCRYPT
MOVWF CNT1
FNC2
MOVLW 07H ; MASK ONLY LOWER 3 BITS
ANDWF TMP1,W
MOVWF OUTBYT ; TEMPORY STORE RESULT
MOVLW (EE_KEY-KEYBASE) ; GET BASE ADDRES OF EEPROM KEY
ADDWF OUTBYT,W ; ... AND ADD TO RESULT
CALL KEY_LOOKUP ; GET BYTE FROM KEY LOOKUP TABLE
XORWF TMP2,F
CALL ROTR ; ROTATE RIGHT 16 BIT WORD
DECFSZ CNT1,F
GOTO FNC2
; ******* EEPROM WRITE ENABLE ******************
WRITE0
MOVLW 30H ; WRITE ENABLE COMMAND
MOVWF OUTBYT
CALL SENDC ; SEND COMMAND TO EEPROM
BCF PORTA,CS ; END COMMAND, DESELECT
; ******** WRITE 16-BIT WORD TO EEPROM *********
WRITE1
MOVFW ADDRESS ; GET EEPROM ADDRESS
MOVWF OUTBYT
BSF OUTBYT,6 ; WRITE COMMAND
CALL SENDC ; SEND COMMAND TO EEPROM
MOVLW 16D ; 16 DATA BITS
MOVWF CNT1
WRITE2
BTFSS TMP1,7 ; TEST MSB OF 16 BIT WORD
BCF PORTA,DIO ; CLEAR DATA BIT
BTFSC TMP1,7 ; ... ELSE
BSF PORTA,DIO ; SET DATA BIT
GOTO $+1 ; WAIT 2 US
RLF TMP2,F ; SHIFT LO BYTE
BSF PORTA,CLK ; CLOCK HIGH
GOTO $+1 ; WAIT 2 US
RLF TMP1,F ; SHIFT HI BYTE
BCF PORTA,CLK ; CLOCK LOW
DECFSZ CNT1,F
GOTO WRITE2 ; LOOP COUNTER
BCF PORTA,CS ; END OF WRITE COMMAND, DESELECT
MOVLW RDCFG
TRIS PORTA ; DIO = INPUT
BSF PORTA,CS ; CS HIGH TO WAIT FOR ACK
CLRF RTCC
WRITE5
BTFSC RTCC,7 ; CHECK FOR TIMOUT
GOTO RESET ; START OVER
CLRWDT ; RESET WATCHDOG TIMER
BTFSS PORTA,DIO ; CHECK FOR ACK RISING EDGE
GOTO WRITE5 ; LOOP BACK
WRITE6 BCF PORTA,CS ; END OF ACK
; ******* EEPROM WRITE DISABLE ****************
MOVLW 000H ; WRITE DISABLE COMMAND
MOVWF OUTBYT
CALL SENDC
BCF PORTA,CS ; END OF DISABLE COMMAND, DESELECT
INCF ADDRESS,F ; POINT TO NEXT EEPROM ADDRESS ( BY DEFAULT )
RETLW 0H
;**************************************************************************
;
; FUNCTION : LEARN_OK ()
;
; DESCRIPTION : LED ON FOR 1 SEK [ INDICATE LEARN SUCCESSFUL ]
;
; PAGE : 0
;
;**************************************************************************
LEARN_OK
CLRF CNT_LW ; CLEAR COUNTER
BSF PORTB,LED ; LED ON FOR 1 SEC
LEARN_OK2
CALL TST_RTCC ; UPDATE COUNTER
BTFSS CNT_LW,5 ; TEST FOR 1 SEC TIMEOUT
GOTO LEARN_OK2 ; LOOP BACK
BCF PORTB,LED ; LED OFF
CLRF CNT_LW
LEARN_OK3
CALL TST_RTCC ; UPDATE COUNTER
BTFSS CNT_LW,4 ; TEST FOR 0.5S TIMEOUT
GOTO LEARN_OK3 ; LOOP BACK
LEARN_END
BSF FLAGS,NORMAL ; SELECT NORMAL MODE
BCF FLAGS,PASS1 ; CLEAR LEARN MODE
BCF FLAGS,PASS2 ; CLEAR LEARN MODE
BSF FLAGS1,S_RSTR ; RESTORE FLAGS
BSF STATUS,PA0 ; CONTINUE ON PAGE 1
GOTO M_LOOP ; RETURN TO MAIN LOOP
;**************************************************************************
;
; FUNCTION : WIPE_TX ()
;
; DESCRIPTION : WIPE CURRENT TX SERIAL NUMBER IN EEPROM
;
; PAGE : 0
;
;**************************************************************************
WIPE_TX
MOVLW LRN_PTR ; POINT LEARN POINTER
MOVWF ADDRESS
CALL EEREAD ; READ LEARN POINTER WORD
BTFSS TMP1,0 ; BUSY LEARNING?
GOTO LEARN_NOK ; .. NO, BYPASS TX WIPE
SWAPF TMP2,W ; RECOVER PREVIOUS TX NUMBER
ANDLW 07H ; MASK ONLY LOWER 3 BITS
CLRF TMP1 ; RESET SELFLEARN POINTER
MOVWF TXNUM ; ... TO CURRENT TXNUM
MOVWF TMP2
MOVLW LRN_PTR ; WRITE LEARN POINTER
MOVWF ADDRESS
CALL EE_WRITE0 ; UPDATE EEPROM
WIPE_TX1
BSF STATUS,PA0 ; CALL TO PAGE 1
CALL TX_LOOKUP ; TO GET BASE ADDRESS OF TX
BCF STATUS,PA0 ; RETURN TO PAGE 0
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CLRF TMP1 ; SET VALUE TO ZERO
CLRF TMP2
CALL EE_WRITE0 ; CLEAR LOWER 16 BITS
CLRF TMP1 ; SET VALUE TO ZERO
CLRF TMP2
CALL EE_WRITE0 ; CLEAR UPPER 16 BITS
;**************************************************************************
;
; FUNCTION : LEARN_NOK ()
;
; DESCRIPTION : LED ON FOR 0.1 SEC [ INDICATE LEARN SUCCESSFUL ]
;
; PAGE : 0
;
;**************************************************************************
LEARN_NOK
BSF FLAGS1,S_RSTR ; RESTORE FLAGS
BCF FLAGS,PASS1
BCF FLAGS,PASS2
BSF FLAGS,NORMAL ; SELECT NORMAL MODE
BCF FLAGS,RESYNC ; RESET RESYNC FLAG
CLRF CNT_LW ; CLEAR COUNTER
BSF PORTB,LED ; LED ON FOR 0.1 SEC
LEARN_NOK2
CALL TST_RTCC ; UPDATE COUNTER
BTFSS CNT_LW,2 ; CHECK FOR 100MS TIMEOUT
GOTO LEARN_NOK2
BCF PORTB,LED ; LED OFF
CLRF CNT_LW
LEARN_NOK3
CALL TST_RTCC ; UPDATE COUNTER
BTFSS CNT_LW,4 ; TEST FOR 0.5S TIMEOUT
GOTO LEARN_NOK3 ; LOOP BACK
BTFSS FLAGS1,ENTRY
GOTO M_LOOP0 ; RETURN TO MAIN LOOP
BSF STATUS,PA0 ; GOTO PAGE 1
GOTO MAIN ; RETURN TO STATUS READ
;**************************************************************************
; PAGE 1:
;**************************************************************************
ORG 200H
;**************************************************************************
; CALLS TO FIRST PAGE
;**************************************************************************
RESET1 BCF STATUS,PA0 ; SELECT PAGE #0
GOTO RESET ; GOTO RESET
EE_READ1
BCF STATUS,PA0 ; SELECT PAGE #0
GOTO EEREAD ; CALL EEPROM READ ROUTINE
EE_CLEAR1
CLRF TMP1 ; CLEAR UPPER 16 BITS
CLRF TMP2 ; ... AND THEN WRITE TO EEPROM
EE_WRITE1
BCF STATUS,PA0 ; SELECT PAGE #0
GOTO EEWRITE ; CALL EEPROM WRITE ROUTINE
;**************************************************************************
;
; FUNCTION : TX_LOOKUP ()
;
; DESCRIPTION : TRANSMITTER MEMORY LOOKUP TABLE
;
; PAGE : 1 ( NOTE : MUST BE LOWER HALF OF PAGE )
;
;**************************************************************************
TX_LOOKUP
CALL TX_LOOKUP2 ; GET VALUE FROM LOOKUP TABLE BELOW
MOVWF ADDRESS ; STORE VALUE IN ADDRESS REGISTER
RETLW 0
; ****** LOOKUP TABLE WITH BASE ADDRESS OF TRANSMITTERS ************
TX_LOOKUP2
MOVFW TXNUM ; GET CURRENT TRANSMITTER
ADDWF PC,1
RETLW 10H ; TX0 BASE ADDRESS
RETLW 18H ; TX1 BASE ADDRESS
RETLW 20H ; TX2 BASE ADDRESS
RETLW 28H ; TX3 BASE ADDRESS
RETLW 30H ; TX4 BASE ADDRESS
RETLW 38H ; TX5 BASE ADDRESS
;**************************************************************************
;
; FUNCTION : BUT_LOOKUP ()
;
; DESCRIPTION : TRANSMITTER BUTTON LOOKUP TABLE
;
; PAGE : 1 ( NOTE : MUST BE LOWER HALF OF PAGE )
;
;**************************************************************************
BUT_LOOKUP
MOVFW TXNUM ; GET CURRENT TRANSMITTER
ADDWF PC,1
RETLW 0AH ; TX0 BUTTON CODE ADDRESS
RETLW 0BH ; TX1 BUTTON CODE ADDRESS
RETLW 0CH ; TX2 BUTTON CODE ADDRESS
RETLW 0DH ; TX3 BUTTON CODE ADDRESS
RETLW 0EH ; TX4 BUTTON CODE ADDRESS
RETLW 0FH ; TX5 BUTTON CODE ADDRESS
;**************************************************************************
;
; FUNCTION : KEYGEN ()
;
; DESCRIPTION : GENERATE A KEY USING MASTER KEY ( ADDR 40H IN ROM )
;
; PAGE : 1
;
;**************************************************************************
KEYGEN
MOVLW KEY7 ; POINT TO FIRST KEY BYTE
MOVWF FSR
MOVLW (MAS_KEY-KEYBASE+7) ; GET TABLE MSB OFFSET FOR MASTER KEY
MOVWF CNT1
MOVLW 8H ; INDICATE 8 BYTE TO READ FROM LOOKUP TABLE
MOVWF CNT0 ; BYTE COUNTER
KEYGEN2
BCF STATUS,PA0 ; SELECT PAGE #0
MOVFW CNT1
CALL KEY_LOOKUP ; GET BYTE FROM LOOKUP TABLE
MOVWF IND ; STORE BYTE IN KEY BYTE
DECF FSR,F ; POINT TO NEXT ENTRY IN CIRCULAR BUFFER
DECF CNT1,F ; POINT TO NEXT ENTRY IN KEY LOOKUP TABLE
BSF STATUS,PA0 ; RE-SELECT PAGE #1
DECFSZ CNT0,F ; ALL BYTES READ
GOTO KEYGEN2 ; ... NO THEN READ NEXT BYTE
MOVFW KEY0 ; SWAP KEY1 AND KEY0
MOVWF OUTBYT ; NOTE : THIS MUST BE DONE BECAUSE THE TMP1 & TMP2
MOVFW KEY1 ; ( KEY0 & KEY1 ) REGISTERS IS ALSO USED
MOVWF KEY0 ; DURING DECRYPTION ( KEYGEN )
MOVFW OUTBYT
MOVWF KEY1
BCF STATUS,PA0 ; SELECT PAGE #0
CALL DECRYPT ; DECRYPT 32 BIT USING MASTER KEY
BSF STATUS,PA0 ; RE-SELECT PAGE #1
MOVFW HOP2 ; GET LOWER 16 BIT OF DECRYPTED WORD
MOVWF TMP1
MOVFW HOP1
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
MOVFW HOP4 ; GET UPPER 16 BIT OF DECRYPTED WORD
MOVWF TMP1
MOVFW HOP3
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
BTFSC ADDRESS,1 ; TEST IF FIRST 32 BIT OF KEY GENERATED
GOTO S_SEED2 ; ... IF SO GENERATE SECOND 32 BITS
GOTO CALC_END ; ... ELSE KEYGEN COMPLETE
;**************************************************************************
;
; FUNCTION : CALC_KEY ()
;
; DESCRIPTION : CALCULATE NEW KEY FROM RECEIVED SERIAL NUMBER
;
; PAGE : 1
;
;**************************************************************************
CALC_KEY
BSF FSR,5
MOVFW HOP1 ; STORE 32 BIT HOPCODE IN THE EXTENDED TEMP BUFFER
MOVWF ETMP1
MOVFW HOP2
MOVWF ETMP2
MOVFW HOP3
MOVWF ETMP3
MOVFW HOP4
MOVWF ETMP4
BCF FSR,5
CALL TX_LOOKUP ; GET TRANSMITTER BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
MOVFW SER_2 ; GET LOWER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_3
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
MOVFW SER_0 ; GET UPPER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_1
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
S_SEED1
MOVLW 20H ; PATCH IF TRANSMITTER IS A HCS360 / HCS300
BTFSC FLAGS,NTQ106
MOVLW 2BH ; PATCH IF TRANSMITTER IS A NTQ106 / NTQ105
IORWF SER_0,W
MOVWF DAT1
MOVFW SER_1 ; GET SERIAL NUMBER FROM RECEIVER BUFFER
MOVWF DAT2
MOVFW SER_2
MOVWF DAT3
MOVFW SER_3
MOVWF DAT4
GOTO KEYGEN ; GENERATE FIRST 32 KEY BITS
S_SEED2
CALL TX_LOOKUP ; GET TRANSMITTER BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EE_READ1 ; READ LOWER 16 BITS OF SERIAL NUMBER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVFW TMP1
MOVWF DAT3
MOVFW TMP2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -