📄 hcs301_pro.asm
字号:
; ****** 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
CALL ROTR ; ROTATE RIGHT 16 BIT WORD
DECFSZ CNT1
GOTO FNC2
; ******* EEPROM WRITE ENABLE ******************
WRITE0
MOVLW 30H ; WRITE ENABLE COMMAND
MOVWF OUTBYT
CALL SENDC ; SEND COMMAND TO EEPROM
BCF PORTB,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 PORTB,DIO ; CLEAR DATA BIT
BTFSC TMP1,7 ; ... ELSE
BSF PORTB,DIO ; SET DATA BIT
GOTO $+1 ; WAIT 2 US
RLF TMP2 ; SHIFT LO BYTE
BSF PORTB,CLK ; CLOCK HIGH
GOTO $+1 ; WAIT 2 US
RLF TMP1 ; SHIFT HI BYTE
BCF PORTB,CLK ; CLOCK LOW
DECFSZ CNT1
GOTO WRITE2 ; LOOP COUNTER
BCF PORTB,CS ; END OF WRITE COMMAND,
DESELECT
MOVLW RDCFG
TRIS PORTB ; DIO = INPUT
BSF PORTB,CS ; CS HIGH TO WAIT FOR ACK
WRITE5
CALL CHK_TIMER
BTFSS PORTB,DIO ; CHECK FOR ACK
GOTO WRITE5
WRITE6
BCF PORTB,CS ; END OF ACK
; ******* EEPROM WRITE DISABLE ****************
MOVLW 000H ; WRITE DISABLE COMMAND
MOVWF OUTBYT
CALL SENDC
BCF PORTB,CS ; END OF DISABLE COMMAND,
DESELECT
INCF ADDRESS ; POINT TO NEXT EE ADDR (DEFAULT)
BSF STATUS,PA0 ; RE-SELECT PAGE #1
RETLW 0H
;-------------------------------------------------------------------------
;
; FUNCTION : EEREAD ()
;
; DESCRIPTION : READ 16 BIT VALUE FROM EEPROM AND DECRYPT
;
; PAGE : 0
;
;-------------------------------------------------------------------------
EEREAD
MOVFW ADDRESS
MOVWF OUTBYT
BSF OUTBYT,7 ; COMMAND = READ
CALL SENDC ; SEND COMMAND
MOVLW RDCFG
TRIS PORTB ; DIO = INPUT
MOVLW 16D ; 16 BITS TO READ
MOVWF CNT1
READ0
BSF PORTB,CLK ; CLOCK HIGH
RLF TMP2 ; SHIFT LO BYTE
BCF TMP2,0 ; ASSUME BIT WILL BE 0
BTFSC PORTB,DIO ; READ DIO LINE
BSF TMP2,0 ; COPY BIT TO REGISTER
BCF PORTB,CLK ; CLOCK LOW
RLF TMP1 ; SHIFT HI BYTE
DECFSZ CNT1 ; LOOP COUNTER
GOTO READ0
BCF PORTB,CS ; END READ CYCLE
; ******* DECRYPT 16-BIT WORD READ FROM EEPROM ***************
IFNC
MOVLW 16D
MOVWF CNT1
IFNC1
CALL ROTL
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 ; KEY BYTE FROM KEY LOOKUP TABLE
XORWF TMP2
DECFSZ CNT1
GOTO IFNC1
BSF STATUS,PA0 ; RE-SELECT PAGE #1
RETLW 0H
;-------------------------------------------------------------------------
;
; FUNCTION : LEARN_OK ()
;
; DESCRIPTION : FLASH LED FOR 3 SEC [ INDICATE LEARN SUCCESSFUL ]
;
; PAGE : 0
;
;-------------------------------------------------------------------------
LEARN_OK
CLRF CNT_HI ; RESET EVENT COUNTER
CLRF CNT_LW
LEARN_OK2
CLRWDT ; RESET WATCHDOG TIMER
BTFSS TIMER0,7 ; TEST FOR 32MS TIMEOUT
GOTO LEARN_OK2 ; ... IF NOT WAIT
BCF TIMER0,7 ; RESET TIMER0 CLOCK
INCF CNT_LW ; INCREASE 16 COUNTER
BTFSC STATUS,Z ; INCREASE UPPER BYTE IF ZERO
INCF CNT_HI
BTFSS CNT_LW,2
BCF PORTA,LED ; FLASH LED @ 4HZ
BTFSC CNT_LW,2
BSF PORTA,LED
BTFSS CNT_LW,7 ; WAIT FOR 3 SEK
GOTO LEARN_OK2
GOTO RESET ; RESET SYSTEM
;-------------------------------------------------------------------------
; 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 : CHK_PASS2 ()
;
; DESCRIPTION : CHECK FOR PASS2 VALUE IN SREG
;
; PAGE : 1
;
;-------------------------------------------------------------------------
CHK_PASS2
MOVLW PASS2 ; TEST IF ON 2ND PASS OF SELFLEARN
XORWF SREG,W ; ZERO BIT WILL BE SET
RETLW 0
;-------------------------------------------------------------------------
;
; FUNCTION : WIPE_TX ()
;
; DESCRIPTION : WIPE CURRENT TX SERIAL NUMBER IN EEPROM
;
; PAGE : 1
;
;-------------------------------------------------------------------------
WIPE_TX
CLRF TMP1 ; SET TO ZERO
CLRF TMP2
CALL TX_LOOKUP ; TO GET BASR ADDRESS OF TX
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EE_CLEAR1 ; CLEAR LOWER 16 BITS
CALL EE_CLEAR1 ; CLEAR UPPER 16 BITS
; ... DO 1SEC ERROR LED NEXT
;-------------------------------------------------------------------------
;
; FUNCTION : ERROR_LED ()
;
; DESCRIPTION : LED ON FOR 1 SEC [ INDICATE ERROR ]
;
; PAGE : 1
;
;-------------------------------------------------------------------------
ERROR_LED
CLRF CNT_HI
CLRF CNT_LW
ERROR_LED2
CLRWDT ; RESET WATCHDOG TIMER
BTFSS TIMER0,7 ; TEST FOR 32MS TIMEOUT
GOTO ERROR_LED2 ; ... ELSE WAIT
BCF TIMER0,7 ; RESET EVENT CLOCK
INCF CNT_LW ; INCREASE 16 COUNTER
BTFSC STATUS,Z ; INCREASE UPPER BYTE IF ZERO
INCF CNT_HI
BSF PORTA,LED ; LED ON TO INDICATE ERROR
BTFSS CNT_LW,5 ; WAIT FOR 1 SEK
GOTO ERROR_LED2
GOTO RESET1 ; RESET SYSTEM
;-------------------------------------------------------------------------
;
; 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 TBLE 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 02H ; TX0 BUTTON CODE ADDRESS
RETLW 03H ; TX1 BUTTON CODE ADDRESS
RETLW 08H ; TX2 BUTTON CODE ADDRESS
RETLW 09H ; TX3 BUTTON CODE ADDRESS
RETLW 0AH ; TX4 BUTTON CODE ADDRESS
RETLW 0BH ; TX5 BUTTON CODE ADDRESS
;-------------------------------------------------------------------------
;
; FUNCTION : NTQ_KEYGEN ()
;
; DESCRIPTION : GENERATE A KEY USING MASTER KEY ( ADDR 40H IN ROM )
;
; PAGE : 1
;
;-------------------------------------------------------------------------
NTQ_KEYGEN
MOVLW KEY7 ; POINT TO FIRST KEY BYTE
MOVWF FSR
MOVLW (MAS_KEY-KEYBASE+7) ; GET TABLE MSB OFFSET FOR M KEY
MOVWF CNT1
MOVLW 8H ; INDICATE 8 BYTE TO READ
MOVWF CNT0 ; BYTE COUNTER
NTQ_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 ; NEXT ENTRY IN CIRCULAR BUFFER
DECF CNT1 ; NEXT ENTRY IN KEY LOOKUP TABLE
BSF STATUS,PA0 ; RE-SELECT PAGE #1
DECFSZ CNT0 ; ALL BYTES READ
GOTO NTQ_KEYGEN2 ; ... NO THEN READ NEXT BYTE
MOVFW KEY0 ; SWAP KEY1 AND KEY0
MOVWF OUTBYT ; NOTE :THIS MUST BE DONE BECAUSE
MOVFW KEY1 ; THE TMP1 & TMP2 (KEY0 &
MOVWF KEY0 ; KEY1) REGISTERS IS ALSO
MOVFW OUTBYT ; USED DURING DECRYPTION
MOVWF KEY1 ; (KEYGEN)
BCF STATUS,PA0 ; SELECT PAGE #0
CALL DECRYPT ; DECRYPT 32 BIT USING MASTER KEY
BSF STATUS,PA0 ; RE-SELECT PAGE #1
MOVFW HOP2 ; GET LOW 16BIT OF DECRYPTED WORD
MOVWF TMP1
MOVFW HOP1
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
MOVFW HOP4 ; GET UP 16 BIT OF DECRYPTED WORD
MOVWF TMP1
MOVFW HOP3
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
BTFSC ADDRESS,1 ; TEST IF FIRST 32BIT OF KEY GEN.
GOTO S_SEED2 ; ... IF SO GENERATE SECOND 32BITS
GOTO CALC_END ; ... ELSE KEYGEN COMPLETE
;-------------------------------------------------------------------------
;
; FUNCTION : CALC_KEY ()
;
; DESCRIPTION : CALCULATE NEW KEY FROM RECEIVED SERIAL NUMBER
;
; PAGE : 1
;
;-------------------------------------------------------------------------
CALC_KEY
MOVFW HOP1 ; STORE 32 BIT HOPCODE IN THE
MOVWF ETMP1 ; EXTENDED TEMP BUFFER
MOVFW HOP2
MOVWF ETMP2
MOVFW HOP3
MOVWF ETMP3
MOVFW HOP4
MOVWF ETMP4
CALL TX_LOOKUP ; GET TRANSMITTER BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
MOVFW SER_2 ; GET LOWER 16 BIT OF SERIAL NR
MOVWF TMP1
MOVFW SER_3
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
MOVFW SER_0 ; GET UPPER 16 BIT OF SERIAL NR
MOVWF TMP1
MOVFW SER_1
MOVWF TMP2
CALL EE_WRITE1 ; ... AND WRITE TO EEPROM
S_SEED1
MOVLW 20H ; PATCH IF TX IS MCHIP HCS ENCODER
BTFSC FLAGS,NTQ106
MOVLW 2BH ; PATCH IF TX IS A NTQ106 ENCODER
IORWF SER_0,W
MOVWF DAT1
MOVFW SER_1 ; GET SERIAL NR FROM RX BUFFER
MOVWF DAT2
MOVFW SER_2
MOVWF DAT3
MOVFW SER_3
MOVWF DAT4
GOTO NTQ_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 LOW 16BITS OF SER # FROM EE
MOVFW TMP1
MOVWF DAT3
MOVFW TMP2
MOVWF DAT4
INCF ADDRESS
CALL EE_READ1 ; READ UP 16BITS OF SER # FROM EE
MOVLW 60H ; PATCH IF TX IS MCHIP HCS ENCODER
BTFSC FLAGS,NTQ106
MOVLW 65H ; PATCH IF TRANSMITTER IS A NTQ106
IORWF TMP1,W
MOVWF DAT1
MOVFW TMP2
MOVWF DAT2
INCF ADDRESS ; POINT TO UPPER 32 BITS OF KEY
INCF ADDRESS
INCF ADDRESS
GOTO NTQ_KEYGEN ; GENERATE SECOND 32 KEY BITS
CALC_END
MOVFW ETMP1 ; RECOVER 32 BIT HOPCODE FROM
MOVWF HOP1 ; EXTENDED BUFFER
MOVFW ETMP2
MOVWF HOP2
MOVFW ETMP3
MOVWF HOP3
MOVFW ETMP4
MOVWF HOP4
CLRF CNT_HI ; RESET EVENT CLOCK
CLRF CNT_LW
GOTO M_HOP
;-------------------------------------------------------------------------
;
; FUNCTION : NTQ_ERASE ()
;
; DESCRIPTION : ERASE ALL TRANSMITTERS
;
; PAGE : 1
;
;-------------------------------------------------------------------------
NTQ_ERASE
BSF PORTA,LED ; SET LED ON
MOVLW 1H ; POINT TO LEARN POINTER ADDRESS
MOVWF ADDRESS
CALL EE_CLEAR1 ; NOTE: CURNT PAGE BIT SET TO #0
CLRF TXNUM ; POINT TO 1ST TX POSISTION IN EE
NTQ_ERASE2
CALL TX_LOOKUP ; GET TX BASE ADRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EE_CLEAR1 ; CLEAR LOW 16BITS OF SERIAL NR
CALL EE_CLEAR1 ; CLEAR UP 16BITS OF SERIAL NR
INCF TXNUM ; POINT TO NEXT EEPROM INDEX
MOVLW 6H ; TEST FOR LAST POSITION
SUBWF TXNUM,W
SKPC ; IF NOT UPDATE NEXT ENTRY
GOTO NTQ_ERASE2
BCF PORTA,LED ; LED OFF TO IND ERASE ALL COMPLTE
M_ERASE3
CLRWDT ; RESET WATCHDOG TIMER
MOVLW TRISA ; UPDATE TRI-STATE REGISTER
TRIS PORTA
BTFSS PORTA,LEARN ; WAIT FOR BUTTON LIFT
GOTO M_ERASE3
GOTO MAIN2 ; THEN WAIT FOR NEXT TRANMISSION
;-------------------------------------------------------------------------
;
; 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 SHFT REG
MOVWF FSR
MOVLW 3H ; READ 3x16BIT VALUES FROM EEPROM
MOVWF CNT2
READ_KEY2
CALL EE_READ1 ; READ LOWER 16 BITS
MOVFW TMP1 ; GET UPPER 8 BITS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -