📄 pincard.a51
字号:
SETB _8255
LCALL D12MS
;SETB ICC3_RST ;ICC3 reset on
;SETB A0
;SETB A1
CLR A0
SETB A1
CLR _8255
MOV R0,#COMMD
MOV A,#0BH
MOVX @R0,A
SETB _8255
CRST_ANSWER:
MOV R0,#DATBUF
LCALL CGET_FIRST_BYTE ;get TS of ATR
JB IC_ER_F,CRST_A4
LCALL CGET_BYTE
JB IC_ER_F,CRST_A4 ;get T0 of ATR
MOV R2,#03H ;loop 3 times
CRST_A1: DEC R0
MOV A,@R0
MOV B,A
INC R0
JNB B.4,CTB1 ;TA exist?
LCALL CGET_BYTE ;get TA
JB IC_ER_F,CRST_A4
CTB1: JNB B.5,CTC1 ;TB exist?
LCALL CGET_BYTE ;get TB
JB IC_ER_F,CRST_A4
CTC1: JNB B.6,CTD1 ;TC exist?
LCALL CGET_BYTE ;get TC
JB IC_ER_F,CRST_A4
CTD1: JNB B.7,CRST_A2 ;TD exist?
LCALL CGET_BYTE ;get TD
JB IC_ER_F,CRST_A4
;DEC R0
;MOV B,@R0
;INC R0
DJNZ R2,CRST_A1
CRST_A2:
MOV R1,#DATBUF+01H
MOV A,@R1
ANL A,#0FH
INC A ; T=1 have checksum byte
MOV R2,A
MOV A,@R1
ANL A,#0F0H
JB ACC.7,CRST_A3
DEC R2
CRST_A3: LCALL CGET_BYTE ;get historical data
JB IC_ER_F,CRST_A4
DJNZ R2,CRST_A3
;CLR IC_PCB3 ;clear PCB of iccard 1
CRST_A4: MOV C,IC_ER_F
RET
T1_COM: ;ICC question and answer
;------------------------------;
; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
;------------------------------;
;JB IC_FLAG,COM1
;LJMP ICC0
COM1: ;CPL IC_PCB1
;MOV R0,#DATBUF+01H
;MOV @R0,#40H
;JNB IC_PCB1, G_EDC0
;MOV @R0,#00H ;get PCB
G_EDC0: ;MOV R0,#DATBUF
;MOV @R0,#00H
;MOV R0,#DATBUF+01H ; get EDC
MOV R1,#DATBUF+02H
MOV A, @R1
ADD A,#03H
MOV R2,A
MOV A,#00H
MOV R0,#DATBUF
G_EDC1: XRL A,@R0
INC R0
DJNZ R2,G_EDC1
MOV @R0,A ; save EDC
SNDIC0: MOV R0,#DATBUF+02H
MOV A, @R0 ;read Data_Length
ADD A, #04H
MOV B, A ;data length save to B register
MOV R0, #DATBUF
SETB ICC1_IO
LCALL DCWT ;time delay program
LCALL DCWT
SNDIC2: CLR ICC1_IO ;start bit
LCALL DWHL ;time delay program
MOV R2,#08H ;data bit = 8
SNDIC1: MOV A,@R0
RR A
MOV @R0,A
MOV C,ACC.7
MOV ICC1_IO,C
LCALL DWHL
DJNZ R2,SNDIC1 ;send word
MOV A,@R0 ;send parity bit
MOV C,PSW.0
MOV ICC1_IO,C
LCALL DWHL
SETB ICC1_IO
LCALL DWHL
INC R0 ;next data
LCALL DCWT ;Waiting Time Between Character
DJNZ B,SNDIC2 ;next data
MOV R0, #DATBUF ;start register R30
REV00: LCALL GET_FIRST_BYTE ;get one byte from IC card
JB IC_ER_F,IC_ERR
MOV B,#02H
REV01: LCALL GET_BYTE
JB IC_ER_F,IC_ERR
DJNZ B,REV01
MOV A,R0
CJNE A,#DATBUF+03H,CKRSP
MOV R1,#DATBUF+02H
MOV B, @R1 ;data LEN save to B
INC B
SJMP REV01
CKRSP: MOV A,R0
CLR C
SUBB A,#DATBUF
MOV B,A
MOV A,#00H
MOV R0,#DATBUF
CK001: XRL A,@R0
INC R0
DJNZ B,CK001
JNZ IC_ERR
DEC R0
DEC R0
MOV A,@R0
JNZ IC_ERR ;00H
DEC R0
MOV A,@R0
CJNE A,#90H,IC_ERR ;90H
CLR IC_ER_F
MOV C,IC_ER_F
RET
IC_ERR: SETB IC_ER_F
MOV C,IC_ER_F
RET
T2_COM: ;ICC question and answer
;------------------------------;
; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
;------------------------------;
;JB IC_FLAG,COM1
;LJMP ICC0
BCOM1: ;CPL IC_PCB2
;MOV R0,#DATBUF+01H
;MOV @R0,#40H
;JNB IC_PCB2, BG_EDC0
;MOV @R0,#00H ;get PCB
BG_EDC0:;MOV R0,#DATBUF
;MOV @R0,#00H
;MOV R0,#DATBUF+01H ; get EDC
MOV R1,#DATBUF+02H
MOV A, @R1
ADD A,#03H
MOV R2,A
MOV A,#00H
MOV R0,#DATBUF
BG_EDC1:XRL A,@R0
INC R0
DJNZ R2,BG_EDC1
MOV @R0,A ; save EDC
BSNDIC0:MOV R0,#DATBUF+02H
MOV A, @R0 ;read Data_Length
ADD A, #04H
MOV B, A ;data length save to B register
MOV R0, #DATBUF
SETB ICC2_IO
LCALL DCWT ;time delay program
LCALL DCWT
BSNDIC2:CLR ICC2_IO ;start bit
LCALL DWHL ;time delay program
MOV R2,#08H ;data bit = 8
BSNDIC1:MOV A,@R0
RR A
MOV @R0,A
MOV C,ACC.7
MOV ICC2_IO,C
LCALL DWHL
DJNZ R2,BSNDIC1 ;send word
MOV A,@R0 ;send parity bit
MOV C,PSW.0
MOV ICC2_IO,C
LCALL DWHL
SETB ICC2_IO
LCALL DWHL
INC R0 ;next data
LCALL DCWT ;Waiting Time Between Character
DJNZ B,BSNDIC2 ;next data
MOV R0, #DATBUF ;start register R30
BREV00: LCALL BGET_FIRST_BYTE ;get one byte from IC card
JB IC_ER_F,BIC_ERR
MOV B,#02H
BREV01: LCALL BGET_BYTE
JB IC_ER_F,BIC_ERR
DJNZ B,BREV01
MOV A,R0
CJNE A,#DATBUF+03H,BCKRSP
MOV R1,#DATBUF+02H
MOV B, @R1 ;data LEN save to B
INC B
SJMP BREV01
BCKRSP: MOV A,R0
CLR C
SUBB A,#DATBUF
MOV B,A
MOV A,#00H
MOV R0,#DATBUF
BCK001: XRL A,@R0
INC R0
DJNZ B,BCK001
JNZ BIC_ERR
DEC R0
DEC R0
MOV A,@R0
JNZ BIC_ERR ;00H
DEC R0
MOV A,@R0
CJNE A,#90H,BIC_ERR ;90H
CLR IC_ER_F
MOV C,IC_ER_F
RET
BIC_ERR:SETB IC_ER_F
MOV C,IC_ER_F
RET
T3_COM: ;ICC question and answer
;------------------------------;
; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
;------------------------------;
;JB IC_FLAG,COM1
;LJMP ICC0
CCOM1: ;CPL IC_PCB3
;MOV R0,#DATBUF+01H
;MOV @R0,#40H
;JNB IC_PCB3, CG_EDC0
;MOV @R0,#00H ;get PCB
CG_EDC0: ;MOV R0,#DATBUF
;MOV @R0,#00H
;MOV R0,#DATBUF+01H ; get EDC
MOV R1,#DATBUF+02H
MOV A, @R1
ADD A,#03H
MOV R2,A
MOV A,#00H
MOV R0,#DATBUF
CG_EDC1:
XRL A,@R0
INC R0
DJNZ R2,CG_EDC1
MOV @R0,A ; save EDC
CSNDIC0:MOV R0,#DATBUF+02H
MOV A, @R0 ;read Data_Length
ADD A, #04H
MOV B, A ;data length save to B register
MOV R0, #DATBUF
SETB ICC3_IO
LCALL DCWT ;time delay program
LCALL DCWT
CSNDIC2:CLR ICC3_IO ;start bit
LCALL DWHL ;time delay program
MOV R2,#08H ;data bit = 8
CSNDIC1:MOV A,@R0
RR A
MOV @R0,A
MOV C,ACC.7
MOV ICC3_IO,C
LCALL DWHL
DJNZ R2,CSNDIC1 ;send word
MOV A,@R0 ;send parity bit
MOV C,PSW.0
MOV ICC3_IO,C
LCALL DWHL
SETB ICC3_IO
LCALL DWHL
INC R0 ;next data
LCALL DCWT ;Waiting Time Between Character
DJNZ B,CSNDIC2 ;next data
MOV R0, #DATBUF ;start register R30
CREV00: LCALL CGET_FIRST_BYTE ;get one byte from IC card
JB IC_ER_F,CIC_ERR
MOV B,#02H
CREV01: LCALL CGET_BYTE
JB IC_ER_F,CIC_ERR
DJNZ B,CREV01
MOV A,R0
CJNE A,#DATBUF+03H,CCKRSP
MOV R1,#DATBUF+02H
MOV B, @R1 ;data LEN save to B
INC B
SJMP CREV01
CCKRSP: MOV A,R0
CLR C
SUBB A,#DATBUF
MOV B,A
MOV A,#00H
MOV R0,#DATBUF
CCK001: XRL A,@R0
INC R0
DJNZ B,CCK001
JNZ CIC_ERR
DEC R0
DEC R0
MOV A,@R0
JNZ CIC_ERR ;00H
DEC R0
MOV A,@R0
CJNE A,#90H,CIC_ERR ;90H
CLR IC_ER_F
MOV C,IC_ER_F
RET
CIC_ERR:SETB IC_ER_F
MOV C,IC_ER_F
RET
T1_OUT:
;------------------------------;
; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
;------------------------------;
CSNDIC01:
;MOV B,#01H ;data length save to B register
MOV R0, #DATBUF
SETB ICC1_IO
LCALL DCWT ;time delay program
LCALL DCWT
CSNDIC21:
CLR ICC1_IO ;start bit
LCALL DWHL ;time delay program
MOV R2,#08H ;data bit = 8
CSNDIC11:
MOV A,@R0
RR A
MOV @R0,A
MOV C,ACC.7
MOV ICC1_IO,C
LCALL DWHL
DJNZ R2,CSNDIC11 ;send word
MOV A,@R0 ;send parity bit
MOV C,PSW.0
MOV ICC1_IO,C
LCALL DWHL
SETB ICC1_IO
LCALL DWHL
RET
T1_IN:
MOV R0, #DATBUF ;start register R30
LCALL GET_FIRST_BYTE ;get one byte from IC card
JB IC_ER_F,CIC_ERR1
CIC_ERR1:
SETB IC_ER_F
MOV C,IC_ER_F
RET
T2_OUT:
;------------------------------;
; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
;------------------------------;
CSNDIC02:
;MOV B,#01H ;data length save to B register
MOV R0, #DATBUF
SETB ICC2_IO
LCALL DCWT ;time delay program
LCALL DCWT
CSNDIC22:
CLR ICC2_IO ;start bit
LCALL DWHL ;time delay program
MOV R2,#08H ;data bit = 8
CSNDIC12:
MOV A,@R0
RR A
MOV @R0,A
MOV C,ACC.7
MOV ICC2_IO,C
LCALL DWHL
DJNZ R2,CSNDIC12 ;send word
MOV A,@R0 ;send parity bit
MOV C,PSW.0
MOV ICC2_IO,C
LCALL DWHL
SETB ICC1_IO
LCALL DWHL
RET
T2_IN: MOV R0, #DATBUF ;start register R30
LCALL BGET_FIRST_BYTE ;get one byte from IC card
JB IC_ER_F,CIC_ERR2
CIC_ERR2:SETB IC_ER_F
MOV C,IC_ER_F
RET
T3_OUT:
;------------------------------;
; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
;------------------------------;
CSNDIC03:
;MOV B,#01H ;data length save to B register
MOV R0, #DATBUF
SETB ICC3_IO
LCALL DCWT ;time delay program
LCALL DCWT
CSNDIC23:
CLR ICC3_IO ;start bit
LCALL DWHL ;time delay program
MOV R2,#08H ;data bit = 8
CSNDIC13:
MOV A,@R0
RR A
MOV @R0,A
MOV C,ACC.7
MOV ICC3_IO,C
LCALL DWHL
DJNZ R2,CSNDIC13 ;send word
MOV A,@R0 ;send parity bit
MOV C,PSW.0
MOV ICC3_IO,C
LCALL DWHL
SETB ICC3_IO
LCALL DWHL
RET
T3_IN: MOV R0, #DATBUF ;start register R30
LCALL CGET_FIRST_BYTE ;get one byte from IC card
JB IC_ER_F,CIC_ERR3
CIC_ERR3:SETB IC_ER_F
MOV C,IC_ER_F
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -