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

📄 f200asm.asm

📁 IC卡底层操作接口,符合正向约定和反向约定.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        MOV     DPL,R1
        ;PUSH    DPH
        ;PUSH    DPL
        MOV     DPHBAK,DPH
        MOV     DPLBAK,DPL
        MOV     DPHBUBAK,DPH
        MOV     DPLBUBAK,DPL
COMMAND_T0_CPU:
	MOV	OFFSET,#00H		;P3中DATA偏移量
	CLR	INS_BUBIT
        MOV     DPH,R6
        MOV     DPL,R7
        INC     DPTR
        MOVX    A,@DPTR
        MOV     INS,A
	CPL	A
	;INC	A
        MOV     INSBU,A			;取出INS反码

        MOV     A,R5
        CLR     C
        SUBB    A,#06H
        JC      COMMAND_T0_CPU1     ;over means LC=0
        INC     DPTR
        INC     DPTR
        INC     DPTR
        MOVX    A,@DPTR
        MOV     LC,A
        ADD     A,#05H		;ler=(len=R5-05-LC)
        MOV     B,A
        CLR     C
        SUBB    A,R5
        JC      COMMAND_T0_CPU0		;c=1,ler=the fifth
        MOV     LER,#00H
        LJMP    COMMAND_T0_CPU2
COMMAND_T0_CPU0:
        MOV     A,B
        ADD     A,R7
        MOV     DPL,A
        MOV     A,#00H
        ADDC    A,R6
        MOV     DPH,A
        MOVX    A,@DPTR
        MOV     LER,A              ;calculate the position of len and take up
        LJMP    COMMAND_T0_CPU2
COMMAND_T0_CPU1:
        INC     DPTR
        INC     DPTR
        INC     DPTR
        MOVX    A,@DPTR
        MOV     LER,A
        MOV     LC,#00H

COMMAND_T0_CPU2:
        MOV     DPH,R6
        MOV     DPL,R7
        MOV     R3,#4
        MOV     RETNUM,#00H
COMMAND_T0_CPU3:
        MOVX    A,@DPTR
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        INC     DPTR
        DJNZ    R3,COMMAND_T0_CPU3
        MOVX    A,@DPTR
        LCALL   SENDCPU_BYTE

        MOV     A,INS
        CJNE    A,#46H,COMMAND_T0_CPU30
        MOV     R3,#0FFH
        SJMP    COMMAND_T0_CPU4
COMMAND_T0_CPU30:
        MOV     R3,#040H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMMAND_T0_CPU4:
        LCALL   RECEIVECPU_BYTE
        JC     COMMAND_T0_CPU4ADD	
	LJMP	COMMAND_T0_CPU14	;接收过程字节失败则跳转到COMMAND_T0_CPU14
COMMAND_T0_CPU4ADD:
        CJNE    A,#60H,COMMAND_T0_CPU5
        LJMP    COMMAND_T0_CPU4		;过程字节=0X60 提供额外的工作等待时间且等待接收另外的过程字节
COMMAND_T0_CPU5:
        CJNE    A,INS,COMMAND_T0_CPU10
        MOV     A,LC
        JZ      COMMAND_T0_CPU8         ;lc=0 or not dicide whether receive or send
COMMAND_T0_CPU6:
        MOV     A,#05H
        ADD     A,R7
        MOV     DPL,A
        MOV     A,#00H
        ADDC    A,R6
        MOV     DPH,A
        LCALL   DELAY_CPU ;;;;;;;;;;;;;;;;;;;;;;;;;;;
        DEC     LC
        MOV     A,LC
        JZ      COMMAND_T0_CPU70
COMMAND_T0_CPU7:
        MOVX    A,@DPTR
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        INC     DPTR
        DJNZ    LC,COMMAND_T0_CPU7
COMMAND_T0_CPU70:
        MOVX    A,@DPTR
        LCALL   SENDCPU_BYTE
        LJMP    COMMAND_T0_CPU4
COMMAND_T0_CPU8:
        ;POP    DPL
        ;POP    DPH
        MOV     DPH,DPHBAK
        MOV     DPL,DPLBAK
        INC    LER
        INC    LER
COMMAND_T0_CPU9:
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T0_CPU14
	MOV	R4,LER
	CJNE	R4,#2H,COMMAND_T0_CPU9ADD1
	CJNE	A,#60H,COMMAND_T0_CPU9ADD0
	LJMP	COMMAND_T0_CPU9
COMMAND_T0_CPU9ADD0:
	CJNE	A,INS,COMMAND_T0_CPU9ADD1
	LJMP	COMMAND_T0_CPU9
COMMAND_T0_CPU9ADD1:
        MOVX    @DPTR,A
        INC     DPTR
        INC     RETNUM
        DJNZ    LER,COMMAND_T0_CPU9
        MOV     A,RETNUM
        MOV     R7,A
        RET
COMMAND_T0_CPU10:
        CJNE    A,#61H,COMMAND_T0_CPU11
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T0_CPU14
        MOV     B,A
        LCALL   DELAY_CPU


        MOV     DPH,R6
        MOV     DPL,R7
        MOV     A,#00H
        MOVX    @DPTR,A
        INC     DPTR

        MOV     A,#0C0H
        MOVX    @DPTR,A
        INC     DPTR

        MOV     A,#00H
        MOVX    @DPTR,A
        INC     DPTR

        MOV     A,#00H
        MOVX    @DPTR,A
        INC     DPTR

        MOV     A,B
        MOVX    @DPTR,A

        MOV     R5,#05H
        LJMP    COMMAND_T0_CPU
COMMAND_T0_CPU14:
        ;POP    DPL
        ;POP    DPH
        MOV     R7,#00H
        RET
COMMAND_T0_CPU11:
        CJNE    A,#6CH,COMMAND_T0_CPUINSBU
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T0_CPU14
        MOV     B,A
        MOV     A,#04H
        ADD     A,R7
        MOV     DPL,A
        MOV     A,#00H
        ADDC    A,R6
        MOV     DPH,A
        MOV     A,B
        MOVX    @DPTR,A
        LCALL   DELAY_CPU
        LJMP    COMMAND_T0_CPU
COMMAND_T0_CPUINSBU:
        CJNE    A,INSBU,COMMAND_T0_CPU12
        MOV     A,LC			;过程字节=INS的补码 
        JZ      COMMAND_T0_CPU8BU         ;lc=0 or not dicide whether receive or send
COMMAND_T0_CPU6BU:	;LC!=0
        MOV     A,#05H
        ADD     A,OFFSET
	INC	OFFSET
        ADD     A,R7
        MOV     DPL,A
        MOV     A,#00H
        ADDC    A,R6
        MOV     DPH,A		;计算出P3中DATA缓冲区的首地址
        LCALL   DELAY_CPU
        MOVX    A,@DPTR
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        DEC     LC
        MOV     A,LC
	SETB	INS_BUBIT		;接收到补码且APDU命令后中有数据
        JZ      COMMAND_T0_CPU9BU	;发送完P3中DATA后跳转到接收SW1SW2
	LJMP	COMMAND_T0_CPU4		;没有发送完P3中DATA继续接收过程字节
COMMAND_T0_CPU8BU:	;LC=0 过程字节=/INS
        ;POP    DPL
        ;POP    DPH
	CLR	INS_BUBIT		;接收到补码且APDU命令后中有数据
        MOV     DPH,DPHBAK
        MOV     DPL,DPLBAK
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T0_CPU14	;超时退出
        MOVX    @DPTR,A
        INC     DPTR
        MOV     DPHBAK,DPH
        MOV     DPLBAK,DPL
        INC     RETNUM
        ;PUSH    DPH
        ;PUSH    DPL
        DJNZ    LER,COMMAND_T0_CPU8BUTIAO;接收一个IC卡返回字节,然后再次接收过程字节
COMMAND_T0_CPU9BU:	;接收SW1SW2
	JNB	INS_BUBIT,COMMAND_T0_CPU9BUADD
        MOV     DPH,DPHBUBAK
        MOV     DPL,DPLBUBAK
COMMAND_T0_CPU9BUADD:	;接收SW1SW2
	LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T0_CPU14	;超时退出
        MOVX    @DPTR,A
        INC     DPTR
        INC     RETNUM
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T0_CPU14	;超时退出
        MOVX    @DPTR,A
        INC     DPTR
        INC     RETNUM
	MOV     A,RETNUM
        MOV     R7,A
        RET
COMMAND_T0_CPU8BUTIAO:
	LJMP	COMMAND_T0_CPU4
COMMAND_T0_CPU12:
        ;POP    DPL
        ;POP    DPH
        MOV     DPH,DPHBAK
        MOV     DPL,DPLBAK
        MOVX    @DPTR,A
        INC     DPTR
        INC     RETNUM
        LCALL   RECEIVECPU_BYTE
        JC	COMMAND_T0_CPU12TIAO
	LJMP	COMMAND_T0_CPU14
COMMAND_T0_CPU12TIAO:
	MOVX    @DPTR,A
        INC     RETNUM
        MOV     A,RETNUM
        MOV     R7,A
        RET


;****************************************************************************
;uchar commandt1_cpu(uint buffer,uchar len,uchar *retbuff)
;                       R6,R7        R5         R3,R2,R1
;****************************************************************************
_COMMAND_T1_CPU:
        MOV     DPH,R6
        MOV     DPL,R7
        INC     DPTR
        MOVX    A,@DPTR
        MOV     INS,A
        CJNE    A,#46H,COMMAND_T1_CPU1
        MOV     R3,#30
        LJMP    COMMAND_T1_CPU3
COMMAND_T1_CPU1:
        CJNE    A,#0EH,COMMAND_T1_CPU2
        MOV     R3,#30
        LJMP    COMMAND_T1_CPU3
COMMAND_T1_CPU2:
        MOV     R3,#1
COMMAND_T1_CPU3:
        MOV     B,#00H
        JB      PCB_CPU,COMMAND_T1_CPU4
        SETB    PCB_CPU
        MOV     A,#00H
        PUSH    ACC
        XRL     A,B
        MOV     B,A
        POP     ACC
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        MOV     A,#00H
        PUSH    ACC
        XRL     A,B
        MOV     B,A
        POP     ACC
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        LJMP    COMMAND_T1_CPU5
COMMAND_T1_CPU4:
        CLR     PCB_CPU
        MOV     A,#00H
        PUSH    ACC
        XRL     A,B
        MOV     B,A
        POP     ACC
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        MOV     A,#40H
        PUSH    ACC
        XRL     A,B
        MOV     B,A
        POP     ACC
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
COMMAND_T1_CPU5:
        MOV     A,R5
        PUSH    ACC
        XRL     A,B
        MOV     B,A
        POP     ACC
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        MOV     DPH,R6
        MOV     DPL,R7
COMMAND_T1_CPU6:
        MOVX    A,@DPTR
        PUSH    ACC
        XRL     A,B
        MOV     B,A
        POP     ACC
        LCALL   SENDCPU_BYTE
        LCALL   DELAY_CPU
        INC     DPTR
        DJNZ    R5,COMMAND_T1_CPU6
        MOV     A,B
        LCALL   SENDCPU_BYTE

                                        ;RECEIVE_T1_CPU
        MOV     R7,#00H
        MOV     B,#00H
        MOV     DPH,R2
        MOV     DPL,R1
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T1_CPU8
        MOV     R3,#01H
        INC     R7
        MOVX    @DPTR,A
        INC     DPTR
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T1_CPU8
        INC     R7
        MOVX    @DPTR,A
        INC     DPTR
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T1_CPU8
        INC     R7
        MOVX    @DPTR,A
        INC     DPTR
        JZ      COMMAND_T1_CPU7
        MOV     R4,A
COMMAND_T1_CPU7:
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T1_CPU8
        INC     R7
        MOVX    @DPTR,A
        INC     DPTR
        DJNZ    R4,COMMAND_T1_CPU7
COMMAND_T1_CPU70:
        LCALL   RECEIVECPU_BYTE
        JNC     COMMAND_T1_CPU8
        INC     R7
        MOVX    @DPTR,A
COMMAND_T1_CPU8:
        RET
;***************************************************************************;
;18432M-12 9600-160-74 19200-80-34 38400-40-14 
RECEIVESAM_BYTEA:
        DJNZ    R1,RECEIVESAM_BYTED
        JB      SAM_IO,RECEIVESAM_BYTEB
        LJMP    RECEIVESAM_BYTE1
RECEIVESAM_BYTEB:
        DJNZ    R2,RECEIVESAM_BYTED
        JB      SAM_IO,RECEIVESAM_BYTEC
        LJMP    RECEIVESAM_BYTE1
RECEIVESAM_BYTEC:
        DJNZ    R3,RECEIVESAM_BYTED
        SETB    SAM_IO
        CLR     C
        RET
RECEIVESAM_BYTED:
        JB      SAM_IO,RECEIVESAM_BYTE0
        LJMP    RECEIVESAM_BYTE1
;start
RECEIVESAM_BYTE:
        MOV     VER_TIME,#04H

RECEIVESAM_BYTESTAR:
        SETB    SAM_IO
        MOV     R2,#00H
        MOV     R1,#00H
	MOV	R3BAK,R3

RECEIVESAM_BYTE0:
        JB      SAM_IO,RECEIVESAM_BYTEA         ;START  ;2
        NOP                                             ;1
        NOP                                             ;1
RECEIVESAM_BYTE1:
        NOP                                             ;1
        NOP                                             ;1
        NOP                                             ;1
        NOP                                             ;1
        NOP                                             ;1

⌨️ 快捷键说明

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