⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f200asm.asm

📁 IC卡底层操作接口,符合正向约定和反向约定.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	NOP
	NOP
	NOP
	NOP
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$
        RRC  A
SENDCPU_BYTE41:
        MOV     CPU_IO,C                ;BIT4

        JNB     PROMISE_CPU,SENDCPU_BYTE5
        NOP
        NOP
        MOV     R0,BAND_DELAY_CPU
        DJNZ    R0,$
        RLC     A
        CPL     C
        LJMP    SENDCPU_BYTE51
SENDCPU_BYTE5:
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$
        RRC  A
SENDCPU_BYTE51:
        MOV     CPU_IO,C                ;BIT5

        JNB     PROMISE_CPU,SENDCPU_BYTE6
        NOP
        NOP
        MOV     R0,BAND_DELAY_CPU
        DJNZ    R0,$
        RLC     A
        CPL     C
        LJMP    SENDCPU_BYTE61
SENDCPU_BYTE6:
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$
        RRC  A
SENDCPU_BYTE61:
        MOV     CPU_IO,C                ;BIT6

        JNB     PROMISE_CPU,SENDCPU_BYTE7
        NOP
        NOP
        MOV     R0,BAND_DELAY_CPU
        DJNZ    R0,$
        RLC     A
        CPL     C
        LJMP    SENDCPU_BYTE71
SENDCPU_BYTE7:
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$
        RRC  A
SENDCPU_BYTE71:
        MOV     CPU_IO,C        ;BIT7			;2
        NOP
        NOP
        NOP
        NOP
        MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$                                    ;2
        POP     ACC                                     ;2
        JB      P,SENDCPU_BYTE8                         ;2
        CLR     CPU_IO;PARITY                           ;2
        SJMP    SENDCPU_BYTE9                           ;2
SENDCPU_BYTE8:
        SETB    CPU_IO;PARITY                           ;2
        NOP
        NOP
SENDCPU_BYTE9:
        NOP
        NOP
        NOP
	NOP
	NOP
	NOP
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$                                    ;2
        SETB    CPU_IO;STOP                             ;2
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$                                    ;3
	JB	CPU_IO,SENDCPU_BYTEOK			;4 11个ETU出判断接收方接收是否正确
	DJNZ	VER_TIME,SENDCPU_BYTEAGAIN		;重新发送数据最多3次
SENDCPU_BYTEAGAIN:
	MOV     R0,BAND_DELAY_CPU                       ;2 检测出错误后延迟3个ETU后重新发送数据
        DJNZ    R0,$                                    ;3
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$                                    ;3
	MOV     R0,BAND_DELAY_CPU                       ;2
        DJNZ    R0,$                                    ;3
	LJMP	SENDCPU_BYTESTAR
SENDCPU_BYTEOK:
	RET
;****************************************************************************
POWER_ON_CPU:
        SETB    CPU_IO
        SETB    OFF_CPU
        MOV     A,ICCARD_BAK
        ORL     A,#(CARD_CV+CPU_CMDVCC+CPU_CS)
        MOV     B,A
        MOV     A,#CPU_RESET
        CPL     A
	ANL	A,B
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A
        MOV     B,A
        MOV     A,#CPU_CMDVCC
        CPL     A
        ANL     A,B
        MOV     ICCARD_BAK,A
        MOVX    @DPTR,A
        MOV     R0,#50
        DJNZ    R0,$
        JB      OFF_CPU,POWER_ON_CPU1
        MOV     A,#00H
        RET
POWER_ON_CPU1:
        RET
;****************************************************************************
POWER_OFF_CPU:
        SETB    CPU_IO
        SETB    OFF_CPU
        MOV     A,ICCARD_BAK
        ORL     A,#CPU_CMDVCC
        MOV     B,A
        MOV     A,#(CPU_RESET+CPU_CS)
        CPL     A
	ANL	A,B
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A
        RET
;****************************************************************************
CPU_REST_IO:
        PUSH    DPH
        PUSH    DPL
        PUSH    ACC

        MOV     A,ICCARD_BAK		;8004
        MOV     B,A
        MOV     A,#CPU_RESET
        CPL     A
        ANL     A,B
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A

        MOV     R0,#80H
        DJNZ    R0,$

        MOV     A,ICCARD_BAK
        ORL     A,#CPU_RESET
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A

;       MOV     A,ICCARD_BAK		;8002
;        ORL     A,#CPU_RESET
;        MOV     ICCARD_BAK,A
;        MOV     DPTR,#ADDR_ICCARD_BAK
;        MOVX    @DPTR,A
;
;        MOV     R0,#80H
;        DJNZ    R0,$

;        MOV     A,ICCARD_BAK
;        MOV     B,A
;        MOV     A,#CPU_RESET
;        CPL     A
;        ANL     A,B
;        MOV     ICCARD_BAK,A
;        MOV     DPTR,#ADDR_ICCARD_BAK
;        MOVX    @DPTR,A

        POP     ACC
        POP     DPL
        POP     DPH
        RET
;;****************************************************************************
;****************************************************************************

_RESET_CPU:               ;c=whether receive a byte returns by over time or in the right way
	CLR     EA
        CLR     RST_CPU
	CLR	ERR_RESET_CPU
        MOV     BAND_DELAY_CPU,#74
	LCALL   POWER_ON_CPU
        JNZ     RESET_CPU0      ;whether card is in
	LCALL   POWER_OFF_CPU
        SETB    EA
        MOV     R7,#0
        RET
RESET_CPU_BAND:
	MOV	A,BAND_DELAY_CPU
        CJNE    A,#74,RESET_CPU_BAND1
        MOV     BAND_DELAY_CPU,#34
        CLR     PCB_CPU
        MOV     DPH,R5
        MOV     DPL,R6
        MOV     R4,#03H
	LJMP	RESET_CPU1
RESET_CPU_BAND1:
        CJNE    A,#34,RESET_CPU_BAND2
        MOV     BAND_DELAY_CPU,#14
        CLR     PCB_CPU
        MOV     DPH,R5
        MOV     DPL,R6
        MOV     R4,#03H
	LJMP	RESET_CPU1
RESET_CPU_BAND2:
        SETB    EA
        MOV     R7,#0
        RET
RESET_CPU0:
	MOV	R0,#240
	DJNZ	R0,$
        CLR     PCB_CPU
        MOV     DPH,R2
        MOV     DPL,R1
        MOV     R5,DPH
        MOV     R6,DPL
        MOV     R4,#03H
RESET_CPU1:
        MOV     R3,#08H         ;receiving over time
        MOV     R7,#0
        CLR     PROMISE_CPU
        LCALL   CPU_REST_IO
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU10		;if over time ,jump
        CJNE    A,#3BH,RESET_CPU2
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
        LJMP    RESET_CPU3
RESET_CPU10:
        LJMP    RESET_CPU9
RESET_CPU2:
        CJNE    A,#3DH,RESET_CPU2ADD
	SETB	ERR_RESET_CPU
	LJMP	RESET_CPU_BAND2
RESET_CPU2ADD:
        CJNE    A,#03H,RESET_CPU_BAND
        SETB    PROMISE_CPU
        MOV     A,#3FH
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_CPU3:
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU10
        MOVX    @DPTR,A
        MOV     B,A
        INC     DPTR
        INC     R7
        ANL     A,#0FH		;retnum=history bytes
        MOV     RETNUM,A

        MOV	A,B;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        JNB     ACC.4,RESET_CPU4
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU10
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_CPU4:
        MOV     A,B
        JNB     ACC.5,RESET_CPU5
        LCALL   RECEIVECPU_BYTE
        JC	RESET_CPU4ADD
	LJMP	RESET_CPU9
RESET_CPU4ADD:
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_CPU5:
        MOV     A,B
        JNB     ACC.6,RESET_CPU6
        LCALL   RECEIVECPU_BYTE
        JC	RESET_CPU5ADD
	LJMP	RESET_CPU9
RESET_CPU5ADD:
        MOVX    @DPTR,A
	CJNE	A,#0FFH,JUDGE_TC1	;if TC1==0xff TC1=0 change by ycl
	CLR	A
JUDGE_TC1:
	MOV     PROTECT_TIME_CPU,A
        INC     DPTR
        INC     R7
RESET_CPU6:
        MOV     A,B
        JNB     ACC.7,RESET_CPU7
        LCALL   RECEIVECPU_BYTE
        JC	RESET_CPU6ADD
	LJMP	RESET_CPU9
RESET_CPU6ADD:
        MOVX    @DPTR,A
        MOV     B,A
        INC     DPTR
        INC     R7
        ANL     A,#0FH
	JZ	RESET_CPU6ADD1
        SETB    PROTOCOL_CPU
	LJMP	RESET_CPU6ADD2
RESET_CPU6ADD1:
        CLR    PROTOCOL_CPU
RESET_CPU6ADD2:
        MOV     A,B;;;;;;;;;;;;;;;;;;;;;
        JNB     ACC.4,RESET_CPU61
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_CPU61:
        JNB     ACC.5,RESET_CPU62
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_CPU62:
        JNB     ACC.6,RESET_CPU63
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_CPU63:
        JNB     ACC.7,RESET_CPU8;;;;;;;;;;;;;;;;;;
        LCALL   RECEIVECPU_BYTE
        JNC     RESET_CPU9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
        ANL     A,#0FH
	JZ	RESET_CPU7
	SETB	PROTOCOL_CPU
        LJMP    RESET_CPU8
RESET_CPU7:
        CLR     PROTOCOL_CPU
RESET_CPU8:
	MOV	A,RETNUM
	CJNE	A,#00H,RESET_CPU8ADD	;判断是否有历史字节
	LJMP	RESET_CPU8ADD1		;无历史字节
RESET_CPU8ADD:
        LCALL   RECEIVECPU_BYTE		;有历史字节并接收
        JNC     RESET_CPU9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
        DJNZ    RETNUM, RESET_CPU8
RESET_CPU8ADD1:
        JNB     PROTOCOL_CPU, RESET_CPU80
        LCALL   RECEIVECPU_BYTE           ;LRC jiao yan he
        JC	RESET_CPU8ADD2
	CLR	OK_RESET_CPU	;T=1的时候未传送TCK则表示复位失败	
        MOV     R0,#0FFH
	LJMP	RESET_CPU_DELAY
RESET_CPU8ADD2:	;成功接收了TCK		
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
	LJMP	RESET_CPUOK
RESET_CPU80:
        LCALL   RECEIVECPU_BYTE	;判断是否在T=0的时候传送TCK
	JNC	RESET_CPUOK
	CLR	OK_RESET_CPU	;T=0的时候传送了TCK则表示复位失败	
        MOV     R0,#0FFH
	LJMP	RESET_CPU_DELAY
RESET_CPUOK:
	SETB	RST_CPU
	SETB	OK_RESET_CPU	;T=0的时候不传送TCK则表示复位成功
        MOV     R0,#0FFH
RESET_CPU_DELAY:
        MOV     R1,#00H
        DJNZ    R1,$
        DJNZ    R0,RESET_CPU_DELAY
        SETB    EA
        RET		                   ;the right way return
RESET_CPU9:
        DJNZ    R4,RESET_CPU90
        SETB    EA
        RET		                   ;over time return
RESET_CPU90:
	MOV	BAND_DELAY_CPU,#74
        CLR     PCB_SAM
        MOV     DPH,R5
        MOV     DPL,R6
        LJMP    RESET_CPU1      	   ;there are three times to reset
;****************************************************************************
;uchar commandt0_cpu(uint buffer,uchar len,uchar *retbuff)
;                       R6,R7        R5         R3,R2,R1
;****************************************************************************
_COMMAND_T0_CPU:
        MOV     DPH,R2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -