📄 sle4442.asm
字号:
;1。卡片复位 RETC
; 入口参数:无
; 出口参数:ATR值存放在;20H。21H。22H。23H
; A2 13 10 91
;2。读卡 Rcard
; 入口参数:起始地址30----
; 出口参数:长度----
; 读出内容起始地址:R0
; 从第0X00开始读256字节
; 30H----4FH,32字节
;3。读错误记数器 RER0
; 记数器 :50H
; 密码: 51H。52H。53H
;4。写记数器 :WER
;5。效验 CKEY
;---------------------------------------------------------------------
SLE4442READMAINMEMORY EQU 30H ;读主存储区
SLE4442READPROTECTIONMEMORY EQU 34H ;读保护存储区
SLE4442UPDATEMAINMEMORY EQU 38H ;写主存储区
SLE4442WRITEPROTECTIONMEMORY EQU 3CH ;写保护存储区
SLE4442READSECURITYMEMORY EQU 31H ;读保密存储区
SLE4442COMPAREVERIFICATIONDATA EQU 33H ;比较验证数据
SLE4442UPDATESECURITYMEMORY EQU 39H ;更新保密存储区
RST EQU P3.2
SDA EQU P3.3
SCL EQU P3.1
;---------------------------------------------------------------------
ATRDATA EQU 30H ; 4 byte 复位应答
ICCOMMAND EQU 34H ; 3 byte 命令
ICADDRESS EQU 35H ; 1 byte 地址
ICDATAIN EQU 36H ; 1 byte 数据
ICLENGTH EQU 37H ; 1 byte 读写长度
ICCODE EQU 38H ; 3 byte 密码
ICDATA EQU 3BH ; 32 byte 读写数据
;---------------------------------------------------------------------
;%RESET
ORG 0000H
SJMP MAIN1
;%START
ORG 0020H
MAIN1:
MOV SP,#10H
MOV R0,#ICCODE ;送密码
MOV @R0,#0B6H
INC R0
MOV @R0,#023H
INC R0
MOV @R0,#007H
LCALL SLE4442_RDSM_EC ;读错误计数器
LCALL SLE4442_VERIFI ; 校验密码
LCALL SLE4442_RDSM_EC ;读错误计数器
MAINLOOP:
MOV ICADDRESS,#20H ;送起始地址
MOV ICLENGTH,#20H ;送长度
LCALL SLE4442_RDMM ;读主存储区
MOV R4,#20H
MOV R0,#ICDATA
CLR A
LOOP1:
MOV @R0,A
INC A
INC R0
DJNZ R4,LOOP1
MOV ICADDRESS,#20H
MOV ICLENGTH,#20H
LCALL SLE4442_WRMM ;写主存储区
MOV ICADDRESS,#20H
MOV ICLENGTH,#20H
LCALL SLE4442_RDMM ;读主存储区
LJMP MAINLOOP
;******************************
;* 读主存储区 *
;******************************
DUZQ: LCALL SLE4442_RST_ATR ;
MOV ICADDRESS,#30H ;
MOV ICLENGTH,#20H ;
LCALL SLE4442_RDMM ;
RET
;******************************
;* 写主存储区 *
;******************************
XZCQ: lcall sle4442_rst_atr ;
MOV ICCODE,#0FFH ;
MOV ICCODE+1,#0FFH ;
MOV ICCODE+2,#0FFH ;
; MOV A,ICCODE
; MOV 69H,A ;
; MOV 6AH,A
LCALL SLE4442_VERIFI ;
CJNE A,#07H,ICDelay
MOV R3,#20H
MOV R0,#70H
MOV R1,#50H
MOV A,50H
XHYU: MOV @R0,A
INC R0
INC R1
XCH A,@R1
DJNZ R3,XHYU
MOV ICADDRESS,#30H ;
MOV ICLENGTH,#20H ;
LCALL SLE4442_WRMM ;
RET
;=====================================================================
;SubName : ICDelay 延时程序
;Function: make a delay period (about 10us)
;Input :
;OutPut :
;---------------------------------------------------------------------
ICDelay:
NOP
NOP
NOP
NOP
RET
;=====================================================================
;SubName : CardPulse 时钟脉冲
;Function: make a pulse on SCL pin
;Input :
;OutPut :
;---------------------------------------------------------------------
CardPulse:
SETB SCL
LCALL ICDelay ; 延时程序
CLR SCL
LCALL ICDelay ; 延时程序
RET
;=====================================================================
;SubName : CardRdByte 读字节
;Function: read one byte from the card on SDA pin
;Input :
;OutPut : A
;---------------------------------------------------------------------
CardRdByte:
MOV R3,#8
SETB SDA
CLR A
Rdbyte:
MOV C,SDA
RRC A
LCALL CardPulse ;时钟脉冲
DJNZ R3,RdByte
RET
;=====================================================================
;SubName : CardWrByte 写字节
;Function: write one byte to the card on SDA pin
;Input : A
;OutPut :
;---------------------------------------------------------------------
CardWrByte:
MOV R3,#8
WrByte:
RRC A
MOV SDA,C
LCALL CardPulse
DJNZ R3,WrByte
RET
;=====================================================================
;SubName : SLE4442_RST_ATR 复位与应答
;Function: reset the card and the answer to erset
;Input :
;OutPut : (ATRDATA),(ATRDATA+1),(ATRDATA+2),(ATRDATA+3)
; : 0xA2,0x13,0x10,0x91
;---------------------------------------------------------------------
SLE4442_RST_ATR:
CLR RST
CLR SCL
LCALL ICDelay
SETB RST
LCALL ICDelay
SETB SCL
LCALL ICDelay
CLR SCL
LCALL ICDelay
CLR RST
LCALL ICDelay
MOV R0,#ATRDATA
MOV R4,#4
ATR:
LCALL CardRdByte
MOV @R0,A
INC R0
DJNZ R4,ATR
RET
;=====================================================================
;SubName : SLE4442_SendCommand 发送命令 3字节
;Function: send a 3-byte command to the card
;Input : ICCOMMAND,ICADDRESS,ICDATAIN
; : (ICCOMMAND),(ICCOMMAND+1),(ICCOMMAND+2)
;OutPut :
;---------------------------------------------------------------------
SLE4442_SendCommand:
;Start condition
SETB SCL
LCALL ICDelay
CLR SDA
LCALL ICDelay
CLR SCL
;3-byte command
MOV R0,#ICCOMMAND
MOV R4,#3
SendCommand:
MOV A,@R0
LCALL CardWrByte
INC R0
DJNZ R4,SendCommand
;Stop condition
CLR SCL
CLR SDA
LCALL ICDelay
SETB SCL
LCALL ICDelay
SETB SDA
LCALL ICDelay
CLR SCL
LCALL ICDelay
RET
;=====================================================================
;SubName : SLE4442_RDMM 读主存储区
;Function: read main memory from the card
;Input : ICADDRESS,ICLENGTH
; : (ICCOMMAND),(ICCOMMAND+1),(ICCOMMAND+2)
;OutPut : (ICDATA),(ICDATA+1) ...
;---------------------------------------------------------------------
SLE4442_RDMM:
LCALL SLE4442_RST_ATR
MOV ICCOMMAND,#SLE4442READMAINMEMORY
LCALL SLE4442_SendCommand
MOV R0,#ICDATA
MOV R4,ICLENGTH
RDMM:
LCALL CardRdByte
MOV @R0,A
INC R0
DJNZ R4,RDMM
RET
;=====================================================================
;SubName : SLE4442_RDPM 读保护存储区
;Function: read protect memory from the card
;Input :
;OutPut : (ICDATA),(ICDATA+1),(ICDATA+2),(ICDATA+3)
;---------------------------------------------------------------------
SLE4442_RDPM:
LCALL SLE4442_RST_ATR
MOV ICCOMMAND,#SLE4442READPROTECTIONMEMORY
LCALL SLE4442_SendCommand
MOV R0,#ICDATA
MOV R4,#4
RDPM:
LCALL CardRdByte
MOV @R0,A
INC R0
DJNZ R4,RDPM
RET
;=====================================================================
;SubName : SLE4442_WRMM 写主存储区
;Function: write main memory to the card
;Input : ICADDRESS,ICLENGTH
; : (ICDATA),(ICDATA+1) ...
;OutPut :
;---------------------------------------------------------------------
SLE4442_WRMM:
LCALL SLE4442_RST_ATR
MOV R5,ICLENGTH
MOV ICCOMMAND,#SLE4442UPDATEMAINMEMORY
MOV R1,#ICDATA
WRMM1:
MOV ICDATAIN,@R1
LCALL SLE4442_SendCommand
MOV R4,#0FFH
WRMM2:
LCALL CardPulse
DJNZ R4,WRMM2
INC ICADDRESS
INC R1
DJNZ R5,WRMM1
RET
;=====================================================================
;SubName : SLE4442_WRPM 写保护存储区
;Function: write protect memory to the card
;Input : ICADDRESS,ICLENGTH
; : (ICDATA),(ICDATA+1) ...
;OutPut :
;---------------------------------------------------------------------
SLE4442_WRPM:
LCALL SLE4442_RST_ATR
MOV R5,ICLENGTH
MOV ICCOMMAND,#SLE4442WRITEPROTECTIONMEMORY
MOV R1,#ICDATA
WRPM1:
MOV ICDATAIN,@R1
LCALL SLE4442_SendCommand
MOV R4,#0FFH
WRPM2:
LCALL CardPulse
DJNZ R4,WRPM2
INC ICADDRESS
INC R1
DJNZ R5,WRPM1
RET
;=====================================================================
;SubName : SLE4442_RDSM 读保密存储区
;Function: read secret memory from the card
;Input :
;OutPut : (ICDATA),(ICDATA+1),(ICDATA+2),(ICDATA+3)
;---------------------------------------------------------------------
SLE4442_RDSM:
LCALL SLE4442_RST_ATR
MOV ICCOMMAND,#SLE4442READSECURITYMEMORY
LCALL SLE4442_SendCommand
MOV R0,#ICDATA
MOV R4,#4
RDSM:
LCALL CardRdByte
MOV @R0,A
INC R0
DJNZ R4,RDSM
RET
;=====================================================================
;SubName : SLE4442_RDSM_EC 读错误计数器
;Function: read error counter from the card
;Input :
;OutPut : A
;---------------------------------------------------------------------
SLE4442_RDSM_EC:
LCALL SLE4442_RST_ATR
MOV ICCOMMAND,#SLE4442READSECURITYMEMORY
LCALL SLE4442_SendCommand
LCALL CardRdByte
RET
;=====================================================================
;SubName : SLE4442_WRSM 更新保密存储区
;Function: write secret memory to the card
;Input : ICADDRESS
; : (ICDATA)
;OutPut :
;---------------------------------------------------------------------
SLE4442_WRSM:
LCALL SLE4442_RST_ATR
MOV R5,#1
MOV ICCOMMAND,#SLE4442UPDATESECURITYMEMORY
MOV R1,#ICDATA
WRSM1:
MOV ICDATAIN,@R1
LCALL SLE4442_SendCommand
MOV R4,#0FFH
WRSM2:
LCALL CardPulse
DJNZ R4,WRSM2
INC ICADDRESS
INC R1
DJNZ R5,WRSM1
RET
;=====================================================================
;SubName : SLE4442_UPDATEPSC 更新密码
;Function: update PSC to the card
;Input : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut :
;---------------------------------------------------------------------
SLE4442_UPDATEPSC:
LCALL SLE4442_RST_ATR
MOV R5,#3
MOV ICCOMMAND,#SLE4442UPDATESECURITYMEMORY
MOV ICADDRESS,#01H
MOV R1,#ICCODE
PSC1:
MOV ICDATAIN,@R1
LCALL SLE4442_SendCommand
MOV R4,#0FFH
PSC2:
LCALL CardPulse
DJNZ R4,PSC2
INC ICADDRESS
INC R1
DJNZ R5,PSC1
RET
;=====================================================================
;SubName : SLE4442_SENDPSC 比较验证数据
;Function: compare PSC to the card
;Input : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut :
;---------------------------------------------------------------------
SLE4442_SENDPSC:
MOV R5,#3
MOV ICCOMMAND,#SLE4442COMPAREVERIFICATIONDATA
MOV ICADDRESS,#01H
MOV R1,#ICCODE
PSC21:
MOV ICDATAIN,@R1
LCALL SLE4442_SendCommand
MOV R4,#123
PSC22:
LCALL CardPulse
DJNZ R4,PSC22
INC ICADDRESS
INC R1
DJNZ R5,PSC21
RET
;=====================================================================
;SubName : SLE4442_VERIFI 校验密码
;Function: verify the card
;Input : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut : A (error counter)
;---------------------------------------------------------------------
SLE4442_VERIFI:
LCALL SLE4442_RDSM_EC
ANL A,#07H
CJNE A,#00H,VERI1
RET
VERI1:
CJNE A,#07H,VERI21
MOV A,#03H
SJMP VERI2
VERI21:
CJNE A,#06H,VERI22
MOV A,#02H
SJMP VERI2
VERI22:
CJNE A,#05H,VERI23
MOV A,#01H
SJMP VERI2
VERI23:
CJNE A,#04H,VERI24
MOV A,#00H
SJMP VERI2
VERI24:
CJNE A,#03H,VERI25
MOV A,#01H
SJMP VERI2
VERI25:
MOV A,#00H
VERI2:
MOV ICDATA,A
MOV ICADDRESS,#00H
LCALL SLE4442_WRSM
LCALL SLE4442_SENDPSC
MOV ICDATA,#07H
MOV ICADDRESS,#00H
LCALL SLE4442_WRSM
LCALL SLE4442_RDSM_EC
ANL A,#07H
RET
;---------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -