ГЛЯНЬТЕ ПЛИЗ УЖЕ УСТАЛ БИТЬСЯ С ЭТИМ БУДЬ ОН НЕ ЛАДЕН
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено aleksander123 17 января 2005 г. 16:17
В ответ на: ХЗ. Неохота разбиратьса. Так быстренько глянул - ничего никуда не девается просто так. отправлено fl3 17 января 2005 г. 16:08

;-------------------------------------------------------------------------
; MICROCHIP KEELOQ DECODER
;-------------------------------------------------------------------------
PROCESSOR PIC12F629
RADIX DEC
include
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF

ERRORLEVEL 0,-302,-305


KEY0 EQU 20H ; 64BIT SHFT REGISTER WITH DECRYPTION KEY
KEY1 EQU 21H
KEY2 EQU 22H
KEY3 EQU 23H
KEY4 EQU 24H
KEY5 EQU 25H
KEY6 EQU 26H
KEY7 EQU 27H

HOP1 EQU 33H ; 32 BIT HOPCODE REGISTER
HOP2 EQU 32H
HOP3 EQU 31H
HOP4 EQU 30H

MASK EQU 40H

CNT0 EQU 41H
CNT1 EQU 42H
TMP5 EQU 43H
TMP1 EQU 44H

ORG 00H

;-------------------------------------------------------------------------
;
; FUNCTION : RESET ()
;
; DESCRIPTION : PROGRAM RESET ROUTINE
;
;-------------------------------------------------------------------------
RESET
MOVLW 00000111B ; SETUP TIMER0 PRESCALER
;|||||||+----
;||||||+----- PSA
;|||||+------
;||||+------- K TMR0
;|||+--------
;||+---------
;|+----------
;+----------- RESIST ON

BSF STATUS,RP0
MOVWF OPTION_REG
BCF STATUS,RP0


;
MAIN
MOVLW 34H
MOVWF KEY0

MOVLW 33H
MOVWF KEY1

MOVLW 5EH
MOVWF KEY2

MOVLW 0F3H
MOVWF KEY3

MOVLW 0BBH
MOVWF KEY4

MOVLW 15H
MOVWF KEY5

MOVLW 0CCH
MOVWF KEY6

MOVLW 2AH
MOVWF KEY7

; КОДЕР HCS200 ИЗ ЗНАЧЕНИЯ 200404A1 ДЕЛАЕТ 45A181BD
; 200404A2 ДЕЛАЕТ 89ECB3AD
; 200404A3 ДЕЛАЕТ 51B39D58
; КОДИРОЮЩИЙ КЛЮЧ ЗАГРУЖЕН В РЕГИСТРЫ LSB 20-27 MSB,
;
; ЧТО НЕОБХОДИМО ИЗМЕНИТЬ В БЛОКЕ DECRYPT ЧТОБЫ ОН ИЗ 200404A1 (ЗАГУЖЕННОГ НИЖЕ)
; ПОЛУЧИТЬ 45A181BD В РЕГ 30-33


CALL ENCR

; CALL ROT_R_KEY

CALL DECRYPT
CLRWDT
GOTO $-2


;-------------------------------------------------------------------------
; FUNCTION : DECRYPT ()
;
; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
;
;-------------------------------------------------------------------------
DECRYPT
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

ROTATE

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
RLF MASK

BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
RLF MASK

; 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
CLRF PCLATH
ADDWF PCL ; ADD THE INDEX TO THE PROGRAM COUNTER
; [ MUST BE IN LOWER HALF OF PAGE ]

TABLECLRF
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 ; ISOLATE THE CORRECT BIT
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 ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY

ROTATE_CSR
CALL ROT_L_CSR

ROTATE_KEY
CALL ROT_L_KEY

DECFSZ CNT0 ; INNER LOOP 48 TIMES
GOTO DECRYPT_INNER ; INNER LOOP 48 TIMES

DECFSZ CNT1 ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)

RETLW 0 ; RETURN
;-------------------------------------------------------------------
RAVNO
CLRWDT
GOTO $-1

ROT_R_KEY
CLRC
BTFSC KEY0,0
SETC

RRF KEY7
RRF KEY6
RRF KEY5
RRF KEY4
RRF KEY3
RRF KEY2
RRF KEY1
RRF KEY0

RETLW 0

ROT_L_KEY
CLRC
BTFSC KEY7,7
SETC

RLF KEY0
RLF KEY1
RLF KEY2
RLF KEY3
RLF KEY4
RLF KEY5
RLF KEY6
RLF KEY7

RETLW 0

ROT_L_CSR
RLF HOP1 ; SHIFT IN THE NEW BIT
RLF HOP2
RLF HOP3
RLF HOP4

RETLW 0

ROT_R_CSR
RRF HOP4
RRF HOP3
RRF HOP2
RRF HOP1

RETLW 0


DECR
MOVLW 0BDH ;ЗАГРУЖЕНО ЗНАЧЕНИЕ MSB 200404A1 LSB ИЗ НЕГО ДОЛЖНО ПОЛУЧИТЬСЯ 45A181BD
MOVWF HOP1 ;ЕСЛИ ЗАГРУЗИТЬ ЗНАЧЕНИЕ 45A181BD ПОЛУЧИТСЯ 200404A1
MOVLW 081H
MOVWF HOP2
MOVLW 0A1H
MOVWF HOP3
MOVLW 045H
MOVWF HOP4

RETLW 0

ENCR
MOVLW 0A1H ;ЗАГРУЖЕНО ЗНАЧЕНИЕ MSB 200404A1 LSB ИЗ НЕГО ДОЛЖНО ПОЛУЧИТЬСЯ 45A181BD
MOVWF HOP1 ;ЕСЛИ ЗАГРУЗИТЬ ЗНАЧЕНИЕ 45A181BD ПОЛУЧИТСЯ 200404A1
MOVLW 004H
MOVWF HOP2
MOVLW 004H
MOVWF HOP3
MOVLW 020H
MOVWF HOP4

RETLW 0

CHEC
MOVLW 0BDH
XORWF HOP1,W
SKPZ
GOTO ROTATE_KEY
MOVLW 081H
XORWF HOP2,W
SKPZ
GOTO ROTATE_KEY
MOVLW 0A1H
XORWF HOP3,W
SKPZ
GOTO ROTATE_KEY
MOVLW 045H
XORWF HOP4,W
SKPZ
GOTO ROTATE_KEY
GOTO RAVNO


END

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru