📄 88sc1608读写子程序.txt
字号:
;--------------------------------------------------------------------
; ATMEL 88SC1608读写子程序
; P1.0--上电 P1.1--SCL P1.2--SDA P1.3--RES
; P1.4-- P1.5-- P1.6-- P1.7--
;--------------------------------------------------------------------
COUNT EQU 3AH
COUNT1 EQU 3BH
;AUTHENTICATION
RI EQU 3DH
SI EQU 3EH
TI EQU 3FHR_I_ADDRESS EQU 40H
S_I_ADDRESS EQU 40H
T_I_ADDRESS EQU 40H
R_0 EQU R_I_ADDRESS
R_1 EQU R_I_ADDRESS+1
R_2 EQU R_I_ADDRESS+2
R_3 EQU R_I_ADDRESS+3
R_4 EQU R_I_ADDRESS+4
R_5 EQU R_I_ADDRESS+5
R_6 EQU R_I_ADDRESS+6
R_7 EQU R_I_ADDRESS+7
KEY EQU 48H
TEMP EQU 49H
BIT0 EQU 4AH
SI_ EQU 4BH
LASTCALC EQU 4CH
Q1_T EQU 4DH
Q2_T EQU 4EH
NBRE EQU 4FH
R_I_O_ADDRESS EQU 0B0H
S_I_O_ADDRESS EQU 0B8H
T_I_O_ADDRESS EQU 0C0H
CRYPTO_ADDRESS EQU 0D0H ;CI
GC_ADDRESS EQU 0D8H ;GRAINE
Q0_ADDRESS EQU 0E0H ;HOST
Q1_ADDRESS EQU 0E8H
Q2_ADDRESS EQU 0F0H
;AUTHENTICATION SUBS=f2
;----------------------------------------------
;CALCULSTATE: IN: RI/SI/TI
; OUT: R_I(0-7)/S_i(0-7)/T_i(0-4)
;USED REGISTERS:R1 R0 R2 A TEMP
;----------------------------------------------
CALCULSTATE: MOV R1,#R_I_O_ADDRESS
MOV R0,#R_I_ADDRESS
MOV R2,#8
CALS001: MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ R2,CALS001 ;LOAD R_I_OUT MEMORY DATAMOV A,R_6
MOV R2,#4
CALS002: RR A
DJNZ R2,CALS002
ANL A,#1
MOV BIT0,A
MOV A,R_6
RL A ;R_6*2
ORL A,BIT0
ANL A,#1FH
MOV TEMP,A
MOV R_6,R_5
MOV R_5,R_4
MOV R_4,R_3
MOV A,R_2
XRL A,RI
MOV R_3,A
MOV R_2,R_1
MOV R_1,R_0 ;1998.4.8 加
MOV A,R_4
ADD A,TEMP
MOV R_0,A
CLR C
SUBB A,#32 ;IF R_0>31
JC CALS003
MOV B,#31
MOV A,R_0
DIV AB
MOV B,#31
MUL AB
MOV TEMP,A
MOV A,R_0
CLR C
SUBB A,TEMP
MOV R_0,A ;R_0%=31
JNZ CALS003
MOV R_0,#31
CALS003:
MOV R1,#R_I_O_ADDRESS
MOV R0,#R_I_ADDRESS
MOV R2,#8
CALS004: MOV A,@R0
MOV @R1,A
INC R1
INC R0
DJNZ R2,CALS004MOV R1,#S_I_O_ADDRESS
MOV R0,#R_I_ADDRESS ;=S_I_ADDRESS
MOV R2,#8
CALS005: MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ R2,CALS005
MOV A,R_6
MOV R2,#6
CALS006: RR A
DJNZ R2,CALS006
ANL A,#1
MOV BIT0,A
MOV A,R_6
RL A
ORL A,BIT0
ANL A,#7FH
MOV TEMP,A
MOV R_6,R_5
MOV A,R_4
XRL A,SI
MOV R_5,A
MOV R_4,R_3
MOV R_3,R_2
MOV R_2,R_1
MOV R_1,R_0
MOV A,R_6
ADD A,TEMP
MOV R_0,A
CLR C
SUBB A,#128
JC CALS007
MOV B,#127
MOV A,R_0
DIV AB
MOV B,#127
MUL AB
MOV TEMP,A
MOV A,R_0
CLR C
SUBB A,TEMP
MOV R_0,A
JNZ CALS007
MOV R_0,#127
CALS007: MOV R1,#S_I_O_ADDRESS
MOV R0,#R_I_ADDRESS
MOV R2,#8
CALS008: MOV A,@R0
MOV @R1,A
INC R1
INC R0
DJNZ R2,CALS008
MOV R1,#T_I_O_ADDRESS ;
MOV R0,#R_I_ADDRESS ;=T_I_ADDRESS
MOV R2,#5
CALS009: MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ R2,CALS009
MOV TEMP,R_4
MOV R_4,R_3
MOV R_3,R_2
MOV A,R_1
XRL A,TI
MOV R_2,A
MOV R_1,R_0
MOV A,R_3
ADD A,TEMP
MOV R_0,A
CLR C
SUBB A,#32
JC CALS0010
MOV B,#31
MOV A,R_0
DIV AB
MOV B,#31
MUL AB
MOV TEMP,A
MOV A,R_0
CLR C
SUBB A,TEMP
MOV R_0,A
JNZ CALS0010
MOV R_0,#31
CALS0010: MOV R1,#T_I_O_ADDRESS
MOV R0,#R_I_ADDRESS
MOV R2,#5
CALS0011: MOV A,@R0
MOV @R1,A
INC R1
INC R0
DJNZ R2,CALS0011
RET
;---------------------------------------
;CALCUL(VOID) OUT: RI SI TI SI_ LASTCALC
;USED REGISTERS:RI SI TI SI_ R_I(0-7) TEMP R1
;---------------------------------------
CALCULV: MOV LASTCALC,#0
MOV SI,#0
MOV RI,#0
MOV TI,#0
LCALL CALCULSTATE
MOV R1,#R_I_O_ADDRESS
MOV A,@R1
MOV R_0,A
MOV R1,#R_I_O_ADDRESS+4
MOV A,@R1
MOV R_4,A
XRL A,R_0
ANL A,#1FH
MOV RI,A
MOV R1,#T_I_O_ADDRESS
MOV A,@R1
MOV R_0,A
MOV R1,#T_I_O_ADDRESS+3
MOV A,@R1
MOV R_3,A
XRL A,R_0
ANL A,#1FH
MOV TI,A
MOV R1,#S_I_O_ADDRESS
MOV A,@R1
MOV SI,A
;*********SI_=~S[0] ?
MOV A,#0FFH
CLR C
SUBB A,SI
MOV SI_,A
;*********SI_=~S[0] ?
MOV A,RI
ANL A,SI_
MOV TEMP,A
MOV A,SI
ANL A,TI
ORL A,TEMP
ANL A,#0FH
MOV LASTCALC,A
RET
;-------------------------------------------
;CALCUL IN: NBRE OUT: LASTCALC
;-------------------------------------------
CALCUL: ACALL CALCULV
;CALC=LASTCALC
DJNZ NBRE,CALCUL
RET
;------------------------------------------
;CALCULKEY(KEY) USE TEMP KEY A
;IN:KEY OUT:R_I(0-7) S_I(0-7) T_I(0-4)
;------------------------------------------
CALCULKEY: MOV A,KEY
ANL A,#1FH
MOV RI,A
MOV A,KEY
RL A
RL A
RL A
ANL A,#78H
MOV TEMP,A
MOV A,KEY
RR A
RR A
RR A
RR A
RR A
ANL A,#7
ADD A,TEMP
MOV SI,A
MOV A,KEY
RR A
RR A
RR A
ANL A,#1fh
MOV TI,A
LCALL CALCULSTATE
RET
;------------------------------------------
;AUTHENTICATION IN CRYPTO0-7,GC0-7,Q0-7
;OUT Q1,Q2
;USED REGISTERS: A,R1,COUNT
;------------------------------------------
AUTHENTICATION: MOV COUNT,#0
AUT001: MOV A,COUNT
RL A ;*2
MOV R1,#CRYPTO_ADDRESS
ADD A,R1
MOV R1,A
MOV A,@R1
MOV KEY,A
ACALL CALCULKEY
AUT0011: MOV R1,#CRYPTO_ADDRESS
MOV A,COUNT
RL A
ADD A,R1
MOV R1,A
INC R1
MOV A,@R1
MOV KEY,A
ACALL CALCULKEY
AUT0012: MOV R1,#Q0_ADDRESS
MOV A,COUNT
ADD A,R1
MOV R1,A
MOV A,@R1
MOV KEY,A
ACALL CALCULKEY
INC COUNT
MOV A,COUNT
CJNE A,#4,AUT001
MOV COUNT,#0
AUT002: MOV A,COUNT
RL A
MOV R1,#GC_ADDRESS
ADD A,R1
MOV R1,A
MOV A,@R1
MOV KEY,A
ACALL CALCULKEY
MOV R1,#GC_ADDRESS
MOV A,COUNT
RL A
ADD A,R1
MOV R1,A
INC R1
MOV A,@R1
MOV KEY,A
ACALL CALCULKEY
MOV R1,#Q0_ADDRESS+4
MOV A,COUNT
ADD A,R1
MOV R1,A
MOV A,@R1
MOV KEY,A
ACALL CALCULKEY
INC COUNT
MOV A,COUNT
CJNE A,#4,AUT002
MOV COUNT,#0
AUT003: MOV NBRE,#2
LCALL CALCUL
MOV A,LASTCALC
RL A
RL A
RL A
RL A
MOV Q2_T,A
MOV NBRE,#2
LCALL CALCUL
MOV A,Q2_T
ORL A,LASTCALC
MOV Q2_T,A
MOV NBRE,#2
LCALL CALCUL
MOV A,LASTCALC
RL A
RL A
RL A
RL A
MOV Q1_T,A
MOV NBRE,#2
LCALL CALCUL
MOV A,Q1_T
ORL A,LASTCALC
MOV Q1_T,A
MOV R1,#Q1_ADDRESS
MOV A,R1
ADD A,COUNT
MOV R1,A
MOV A,Q1_T
MOV @R1,A
MOV R1,#Q2_ADDRESS
MOV A,R1
ADD A,COUNT
MOV R1,A
MOV A,Q2_T
MOV @R1,A
INC COUNT
MOV A,COUNT
CJNE A,#8,AUT003
RET
;--------------------------------------------------------------------
;AUTH: 密码认证子程序
; 功能:密码认证
; 输入:CI,GC,Q0
; 输出:
;--------------------------------------------------------------------
AUTH: MOV R1,#90H ;清内部RAM 90H--FFH
MOV R3,#70H
CLR A
AUTH01: MOV @R1,A
INC R1
DJNZ R3,AUTH01
MOV R1,#CRYPTO_ADDRESS ;保存CI,GC,Q0
MOV R3,#18H
MOV R0,#31H
AUTH02: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R3,AUTH02
LCALL AUTHENTICATION ;生成Q1,Q2
MOV R0,#40H
MOV R1,#Q0_ADDRESS
MOV R3,#18H
AUTH03: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,AUTH03
MOV R0,#40H
LCALL IA ;初始化认证
MOV A,30H
CJNE A,#03H,AUTH06
LCALL WAIT10 ;延时10MS
LCALL VA ;校验认证
MOV A,30H
CJNE A,#03H,AUTH06
LCALL WAIT10 ;延时10MS
MOV 32H,#20H
MOV 33H,#10H
MOV A,23H
CJNE A,#0A2H,AUTH031
LCALL RCZ ;读AAC及CI
MOV R0,#3AH ;比较CI及Q2
MOV R1,#50H
MOV R3,#08H
SJMP AUTH032
AUTH031: MOV 32H,#0E0H
MOV 33H,#10H
LCALL RD153
MOV R0,#33H ;比较CI及Q2
MOV R1,#51H
MOV R3,#07H
AUTH032: MOV A,32H
CJNE A,#0FFH,AUTH07
AUTH04: MOV A,@R0 ;比较CI及Q2
MOV B,A
MOV A,@R1
CJNE A,B,AUTH06
INC R0
INC R1
DJNZ R3,AUTH04
MOV 30H,#03H
MOV 31H,#00H
RET
AUTH06: MOV 30H,#04H
MOV 31H,#00H
RET
AUTH07: MOV 30H,#04H
MOV 31H,#01H
RET
;--------------------------------------------------------------------
; ATR: 复位响应子程序
; 功能:复位响应,输出32位应答信息,数据放入@R0
;--------------------------------------------------------------------
ATR:
CLR P1.3 ;IC的RST端低
SETB P1.2 ;SDA IS HIGH
NOP
CLR P1.1 ;SCL IS LOW
NOP
NOP
SETB P1.3 ;IC的RST端开始变高
NOP
MOV R4,#4 ;计数器赋值
MOV R0,#32H ;放数据地址
NOP
SETB P1.1 ;IC的SCL端开始变高
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR P1.1 ;IC的SCL端开始变低
NOP
NOP
NOP
NOP
CLR P1.3 ;IC的RST端开始变低
NOP
NOP
NOP
ATR1: MOV R3,#8
ATR2: SETB P1.1 ;IC的SCL端开始变高
NOP
MOV C,P1.2
RRC A
NOP
NOP
NOP ;脉冲宽度10us
NOP
NOP
NOP
NOP
CLR P1.1 ;IC的SCL端开始变低
NOP
NOP
NOP
NOP ;脉冲宽度10us
NOP
NOP
NOP
NOP
DJNZ R3,ATR2
MOV @R0,A
INC R0
DJNZ R4,ATR1
MOV C,P1.2
JC ATR3 ;IO为高则复位完成
MOV 30H,#04H
MOV 31H,#00H
RET
ATR3: MOV 30H,#03H
MOV 31H,#04H
RET
;--------------------------------------------------------------------
; SUZA: 设置用户区地址 Set User Zone Address
; 31H: 用户区高位敌址
; 30H=#03H,正确 ; 30H=#04H,卡不反应
;--------------------------------------------------------------------
SUZA: LCALL START
MOV A,#0B2H
LCALL SPOUT
JC ER1
MOV A,31H
LCALL SPOUT
JC ER1
LCALL STOP
MOV 30H,#03H
RET
ER1: MOV 30H,#04H
RET
;--------------------------------------------------------------------
; RUZ: 读用户区数据 Read User Zone
; 32H: 用户区低位地址 33H: 用户区读数据字节数
; 30H=#03H,正确 ; 30H=#04H,卡不反应
; 数据放入@R0
;--------------------------------------------------------------------
RUZ: MOV 31H,33H
MOV R0,#32H
LCALL START
MOV A,#0B1H
LCALL SPOUT
JC ER2
MOV A,32H
LCALL SPOUT
JC ER2
MOV R3,33H
RUZ1: DEC R3
CJNE R3,#00H,RUZ2
SJMP RUZ3
RUZ2: LCALL SPIN ;读一个数据到A,有回答信号
MOV @R0,A
INC R0
SJMP RUZ1
RUZ3: LCALL SPIN2 ;读一个数据到A,没有回答信号
MOV @R0,A
LCALL STOP
MOV 30H,#03H
RET
ER2: MOV 30H,#04H
MOV 31H,#00H
RET
;--------------------------------------------------------------------
; RCZ: 读用户区数据 Read Configuration Zone
; 32H: 低位地址 33H: 读数据字节数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -