📄 secsys14.asm
字号:
MOVWF DAT4
INCF ADDRESS,F
CALL EE_READ1 ; READ UPPER 16 BITS OF SERIAL NUMBER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVLW 60H ; PATCH IF TRANSMITTER IS A HCS360 / HCS300
BTFSC FLAGS,NTQ106
MOVLW 65H ; PATCH IF TRANSMITTER IS A NTQ106 / NTQ105
IORWF TMP1,W
MOVWF DAT1
MOVFW TMP2
MOVWF DAT2
INCF ADDRESS,F ; POINT TO UPPER 32 BITS OF KEY
INCF ADDRESS,F
INCF ADDRESS,F
GOTO KEYGEN ; GENERATE SECOND 32 KEY BITS
CALC_END
BSF FSR,5
MOVFW ETMP1 ; RECOVER 32 BIT HOPCODE FROM EXTENDED BUFFER
MOVWF HOP1
MOVFW ETMP2
MOVWF HOP2
MOVFW ETMP3
MOVWF HOP3
MOVFW ETMP4
MOVWF HOP4
BCF FSR,5
CLRF CNT_HI ; RESET EVENT CLOCK
CLRF CNT_LW
GOTO M_HOP
;**************************************************************************
;
; FUNCTION : ERASE ()
;
; DESCRIPTION : ERASE ALL TRANSMITTERS
;
; PAGE : 1
;
;**************************************************************************
ERASE
BSF FLAGS1,S_RSTR ; FLAGS MUST BE RESTORED
BSF PORTB,LED ; SET LED ON
MOVLW 1H ; POINT TO LEARN POINTER ADDRESS
MOVWF ADDRESS
CALL EE_CLEAR1 ;
BSF STATUS,PA0 ; SELECT PAGE 1
CLRF TXNUM ; POINT TO FIRST TRANSMITTER POSISTION IN EEPROM
ERASE2
CALL TX_LOOKUP ; GET TX BASE ADRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EE_CLEAR1 ; CLEAR LOWER 16 BITS OF SERIAL NUMBER
BSF STATUS,PA0 ; SELECT PAGE 1
CALL EE_CLEAR1 ; CLEAR UPPER 16 BITS OF SERIAL NUMBER
BSF STATUS,PA0 ; SELECT PAGE 1
INCF TXNUM,F ; POINT TO NEXT EEPROM INDEX
MOVLW 6H ; TEST FOR LAST POSITION
SUBWF TXNUM,W
BTFSS STATUS,CARRY ; IF NOT UPDATE NEXT ENTRY
GOTO ERASE2
BCF PORTB,LED ; LED OFF TO INDICATE ERASE ALL COMPLETE
M_ERASE3
CLRWDT ; RESET WATCHDOG TIMER
BTFSC PORTC,LEARN ; WAIT FOR BUTTON LIFT
GOTO M_ERASE3
GOTO M_LOOP ; RETURN TO MAIN PROGRAM FLOW
;**************************************************************************
;
; FUNCTION : READ_KEY ()
;
; DESCRIPTION : READ 64 BIT KEY FROM EEPROM [CSR0:CSR7]
;
; PAGE : 1
;
;**************************************************************************
READ_KEY
MOVLW 3H ; POINT TO MSB OF KEY
ADDWF ADDRESS,1
MOVLW KEY7 ; POINT TO LSB OF 64 BIT SHIFT REGISTER
MOVWF FSR
MOVLW 3H ; READ 3 x 16BIT VALUES FROM EEPROM
MOVWF CNT2
READ_KEY2
CALL EE_READ1 ; READ LOWER 16 BITS
BSF STATUS,PA0 ; SELECT PAGE #1
MOVFW TMP1 ; GET UPPER 8 BITS
MOVWF IND ; STORE FIRST 8 BITS IN 64 BIT SHIFT REGISTER
DECF FSR,F ; POINT TO NEXT BYTE IN SHIFT REGISTER
MOVFW TMP2 ; GET LOWER 8 BITS
MOVWF IND ; STORE SECOND 8 BITS IN 64 BIT SHIFT REGISTER
DECF FSR,F ; POINT TO NEXT BYTE IN SHIFT REGISTER
DECF ADDRESS ; POINT TO NEXT EEPROM ADDRESS
DECFSZ CNT2,F ; ALL THREE 16-BIT WORDS READ
GOTO READ_KEY2 ; ... IF NOT GET NEXT
CALL EE_READ1 ; READ LOWER 16 BITS
BSF STATUS,PA0 ; SELECT PAGE #1
GOTO M_DEC ; RETURN TO MAIN PROGRAM LOOP
;**************************************************************************
;
; FUNCTION : MAIN ()
;
; DESCRIPTION : MAIN PROGRAM ROUTINE
;
; PAGE : 1
;
;**************************************************************************
RESET_P1
CLRF FSR ; POINT TO RAM PAGE 0
CLRF PORTA ; RESET PORTA
CLRF PORTB ; RESET PORTB
CLRF PORTC ; RESET PORTC
MOVLW TRISA ; UPDATE TRI-STATE REGISTER FOR PORTA
TRIS PORTA
MOVLW TRISB ; UPDATE TRI-STATE REGISTER FOR PORTB
TRIS PORTB
MOVLW TRISC ; UPDATE TRI-STATE REGISTER FOR PORTC
TRIS PORTC
CLRF FLAGS ; RESET FLAGS
CLRF FLAGS1 ; RESET FLAGS
BSF FLAGS1,ENTRY ; SET ENTRY FLAG
MAIN
BSF FLAGS,NORMAL ; INDICATE NORMAL PROGRAM FLOW
BCF FLAGS,PASS1
BCF FLAGS,PASS2
MOVLW LRN_PTR ; POINT LEARN POINTER
MOVWF ADDRESS
CALL EE_READ1 ; READ LEARN POINTER WORD
BSF STATUS,PA0 ; SELECT PAGE #1
BTFSS TMP1,0
GOTO MAIN2 ; UPPER BIT OF SELFLEARN NIBBLE MUST BE ZERO
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_WRITE1 ; UPDATE EEPROM
BCF STATUS,PA0
GOTO WIPE_TX1 ; WIPE TRANSMITTER ( SELFLEARN UNSUCCESFUL )
MAIN2
BCF FLAGS1,ENTRY ; CLEAR ENTRY FLAG
MAIN3
MOVLW SSTATUS ; POINT STATUS
MOVWF ADDRESS
CALL EE_READ1 ; READ STATUS
BSF STATUS,PA0 ; SELECT PAGE #1
MOVLW X2 ; CHECK FOR VALID STATUS WRITE
XORWF TMP2,W
BTFSC STATUS,ZERO
GOTO MAIN4 ; VALID STATUS
; HERE IF STATUS NOT VALID
MOVLW BSTATUS ; POINT TO BACKUP COPY
MOVWF ADDRESS
CALL EE_READ1
BSF STATUS,PA0 ; READ BACKUP STATUS COPY
MOVLW X1
XORWF TMP2,W ; CHECK FOR VALID WRITE
BTFSC STATUS,ZERO
GOTO MAIN4 ; VALID BACKUP STATUS
; HERE IF BACKUP ALSO CORRUPTED
BCF STATUS,PA0 ; GOTO ARMED STATE
BSF STATUS,PA1
GOTO ARMED ;
MAIN4
MOVLW DRIVES
XORWF TMP1,W
BTFSS STATUS,ZERO
GOTO MAIN5
BCF STATUS,PA0
BSF STATUS,PA1
GOTO DRIVE
MAIN5
MOVLW ALARMS
XORWF TMP1,W
BTFSS STATUS,ZERO
GOTO MAIN6
BCF STATUS,PA0
BSF STATUS,PA1
GOTO ALARM
MAIN6
MOVLW IMMOBS
XORWF TMP1,W
BTFSS STATUS,ZERO
GOTO MAIN7
BCF STATUS,PA0
BSF STATUS,PA1
GOTO IMMOB
MAIN7
BCF STATUS,PA0
BSF STATUS,PA1
GOTO ARMED
M_CHECK
BCF STATUS,PA0 ; CLEAR PAGE BIT #0
CALL TST_LEARN ; TEST & HANDLE LEARN BUTTON
CALL RECEIVE ; RECEIVE TRANSMISSION
BSF STATUS,PA0 ; SET PAGE BIT #0
BTFSS STATUS,CARRY
GOTO M_ZERO
M_LOOP
BCF STATUS,PA0
BSF STATUS,PA1
MOVLW 2
ADDWF STACK,W
BSF STATUS,CARRY
MOVWF PC
M_ZERO
MOVLW 0FH ; MAXIMUM SERIAL NUMBER IS 28 BITS
ANDWF SER_0,1
MOVFW SER_0 ; CHECK SERIAL NUMBER NOT EQUAL TO ZERO
IORWF SER_1,W
IORWF SER_2,W
IORWF SER_3,W
BTFSC STATUS,ZERO
GOTO M_LOOP ; ... IF ZERO WAIT FOR NEXT TRANSMISSION
BTFSS FLAGS,PASS2 ; IF ON SECOND LEARNING PASS TXNUM IS LEARNING POSITION
CLRF TXNUM ; ... ELSE POINT TO FIRST TRANSMITTER
; ******* COMPARE LOWER WORD OF SERIAL NUMBER ********
M_SERIAL
CALL TX_LOOKUP ; GET TX 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 ; COMPARE RX AND EEPROM VALUES
XORWF SER_2,W
BTFSS STATUS,ZERO ; ... IF NOT EQUAL DO ERROR
GOTO M_SER_ERR
MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_3,W
BTFSS STATUS,ZERO ; ... IF NOT EQUAL DO ERROR
GOTO M_SER_ERR
; ******* COMPARE UPPER WORD OF SERIAL NUMBER ********
M_SERIAL2
INCF ADDRESS,F ; POINT TO NEXT ENTRY
CALL EE_READ1 ; READ UPPER 16-BITS OF SERIAL NUMBER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES
XORWF SER_0,W
BTFSS STATUS,ZERO ; ... IF NOT EQUAL DO ERROR
GOTO M_SER_ERR
MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_1,W
BTFSS STATUS,ZERO ; ... IF NOT EQUAL DO ERROR
GOTO M_SER_ERR
; ************* TEST IF LEARN ACTIVE ****************
M_PASS
BTFSC FLAGS,PASS1
GOTO CALC_KEY ; TEST IF ON FIRST PASS OF LEARN
GOTO M_HOP ; TEST FOR NORMAL PROGRAM FLOW
; ******** SERIAL NUMBER COMPARE ERROR FOUND ***********
M_SER_ERR
; **** SEARCH NEXT POSITION FOR SERIAL NUMBER *****
M_NEXT INCF TXNUM,F ; POINT TO NEXT TRANSMITTER POSITION
MOVLW 6H ; TEST FOR LAST POSITION
SUBWF TXNUM,W
BTFSS STATUS,CARRY ; ... IF NOT GET NEXT ENTRY
GOTO M_SERIAL
; **** SERIAL NUMBER NOT FOUND ( ONLY IN NORMAL / PASS1 ) **********
BTFSC FLAGS,PASS1
GOTO M_NF ; TEST IF ON FIRST PASS OF SELFLEARN
BTFSS FLAGS,PASS2
GOTO M_LOOP ; CHECK IF IN SECOND STATE OF LEARN
GOTO MAIN
; *** IF SERIAL NOT IN MAP READ SELFLEARN POINTER ***
M_NF MOVLW LRN_PTR ; POINT TO LEARN POINTER
MOVWF ADDRESS
CALL EE_READ1 ; READ LEARN POINTER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVLW 07H ; MASK TXNUM FROM POINTER
ANDWF TMP2,W
MOVWF TXNUM
BTFSS TXNUM,2 ; TXNUM < 4 IS VALID
GOTO CALC_KEY ; ... YES, GENERATE DECRYPTION KEY
BTFSC TXNUM,1 ; TXNUM > 5 IS INVALID
CLRF TXNUM ; ... LEARN POSITION SET TO ZERO
GOTO CALC_KEY ; LEARN CURRENT RECEIVED TRANSMITTER
; ********** DECRYPT HOPCODE *********************
M_HOP
CALL TX_LOOKUP ; LOOK UP TRANSMITTER BASE ADDRESS
BSF ADDRESS,2 ; ADD 4 TO BASE ADDRESS
GOTO READ_KEY ; READ 64 BIT DECODER KEY ( CALL "READ_KEY")
M_DEC
BCF STATUS,PA0 ; SELECT PAGE #0
CALL DECRYPT ; DECRYPT HOPCODE
BSF STATUS,PA0 ; RE-SELECT PAGE #1
BTFSS FLAGS,PASS1
GOTO M_DIS ; TEST IF ON FIRST PASS OF SELFLEARN
; ********* UPDATE BUTTON CODE AND DISCR VALUE AFTER SELFLEARN **********
M_SL_UPDATE
MOVLW LRN_PTR ; POINT LEARN POINTER
MOVWF ADDRESS
CALL EE_READ1 ; READ LEARN POINTER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVLW 1H ; INDICATE LEARN ACTIVE IN EEPROM
MOVWF TMP1
MOVLW 0FH ; MASK LEARN POINTER
ANDWF TMP2,1
MOVLW 6H ; TEST FOR INVALID LEARN POINTER
SUBWF TMP2,W ; TEST FOR INVALID LEARN POINTER
BTFSC STATUS,CARRY ; TEST FOR INVALID LEARN POINTER
CLRF TMP2 ; ... IF INVALID POINT TO FIRST POSITION
SWAPF TXNUM,W ; COPY TXNUM INTO UPPER NIBBLE
IORWF TMP2,1
CALL EE_WRITE1 ; UPDATE LEARN POINTER IN EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
CALL BUT_LOOKUP ; GET BUTTON CODE BASE ADDRESS
MOVWF ADDRESS
MOVFW FUNC ; GET CURRENT RX BUTTON CODE
MOVWF TMP1
MOVFW CODE ; GET CURRENT RX DISCR CODE
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE BUTTON & DISCR CODES TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
MOVFW CNTR_HI ; STORE ONE RX COUNTER
MOVWF TMP1
MOVFW CNTR_LW
MOVWF TMP2
CALL TX_LOOKUP ; POINT TO LSB WORD OF SERIAL NUMBER
CALL EE_WRITE1 ; WRITE ONE 16-BIT COUNTER TO EEPROM
BSF STATUS,PA0 ; RE-SELECT PAGE #1
BCF PORTB,LED ; LED OFF TO INDICATE FIRST VALID TRANSMISSION RECEIVED
BSF FLAGS,PASS2 ; INDICATE PASS2 OF LEARN NOW ACTIVE
BCF FLAGS,PASS1 ; INDICATE PASS2 OF LEARN NOW ACTIVE
BCF FLAGS,NORMAL ; CLEAR NORMAL MODE
GOTO M_RESYNC ; FORCE A COUNTER RESYNC
; ********* TEST DICRIMINATION VALUE *************
M_DIS
CALL BUT_LOOKUP ; POINT TO BUTTON CODE ADDRESS
MOVWF ADDRESS ; STORE VALUE IN ADDRESS REGISTER
CALL EE_READ1
BSF STATUS,PA0 ; SELECT PAGE #1
BTFSS FLAGS,PASS2
GOTO M_DIS2 ; CHECK IF IN SECOND PASS OF LEARN
MOVFW TMP1 ; CHECK DISC VALUE
XORWF FUNC,W
ANDLW 0F0H ; MASK BUTTON CODES
BTFSC STATUS,ZERO
GOTO M_DIS2 ; IF EQUAL CONTINUE
GOTO MAIN
M_DIS2
MOVFW TMP2 ; CHECK DISCRIMINATION VALUE
XORWF CODE,W
BTFSC STATUS,ZERO ; IF EQUAL CONTINUE
GOTO M_CNT
BCF FLAGS,RESYNC ; RESET RESYNC FLAG
BTFSS FLAGS,PASS2
GOTO M_LOOP ; TEST IF IN SECOND PASS OF LEARN
GOTO MAIN
; *************** CHECK COUNTERS VALID ************
M_CNT
BTFSS FLAGS,RESYNC ; TEST RESYNC BIT
GOTO M_CNT1 ; ... IF NOT GET COUNTERS FROM EEPROM
MOVLW TMPCNT
MOVWF ADDRESS
CALL EE_READ1
BSF STATUS,PA0 ; SELECT PAGE #1
GOTO M_SUB ; SUBSTRACT FROM CURRENT COUNTER
M_CNT1
CALL TX_LOOKUP ; POINT LOWER 16 BIT COUNTER
CALL EE_READ1 ; READ LOWER 16 BIT COUNTER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVFW TMP1 ; TEMPORY STORE FIRST 16-BIT COUNTER
MOVWF TMP3
MOVFW TMP2
MOVWF TMP4
INCF ADDRESS,F ; POINT TO UPPER 16-BIT COUNTER
CALL EE_READ1 ; READ UPPER 16-BIT COUNTER FROM EEPROM
BSF STATUS,PA0 ; SELECT PAGE #1
MOVFW TMP1 ; COMPARE UPPER BYTES OF EEPROM COUNTER
XORWF TMP3,W
BTFSS STATUS,ZERO ; ... IF EQUAL COMPARE LOWER
GOTO M_CNT3 ; ... IF NOT EQUAL FORCE RESYNC
MOVFW TMP2 ; COMPARE LOWER BYTES OF EEPROM COUNTER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -