📄 card_cpuv21.inc
字号:
SEND_ONEBYTEONL: ;发送一个字节,包括起始位和效验位
RES 5,(SAM_ASPE)
;AND (SAM_ASPE),0xDF
LD C,8
RCF
;STCF A,(P6) ;发送起始位0
STCF A,(cc_port)
CALL DELAY1_0ETU
LDCF 0,(SAM_ASPE) ;判断正向或反向约定
JR C,SEND_REVER
ONE_FINI:
RRC 1,B
;STCF A,(P6)
STCF A,(cc_port)
XORCF 5,(SAM_ASPE)
STCF 5,(SAM_ASPE) ;为了奇偶效验
CALL DELAY1_0ETU
DJNZ C,ONE_FINI
LDCF 5,(SAM_ASPE) ;将余数送入cy
JR SEND_COMM
SEND_REVER:
RRC 1,B
CCF
;STCF A,(P6)
STCF A,(cc_port)
XORCF 5,(SAM_ASPE)
STCF 5,(SAM_ASPE) ;为了奇偶效验
CALL DELAY0_9ETU
DJNZ C,SEND_REVER
LDCF 5,(SAM_ASPE) ;将余数送入cy
CCF
SEND_COMM:
;STCF A,(P6)
STCF A,(cc_port) ;发送奇偶效验位
CALL DELAY1_0ETU
CALL IO_IN ;发送完一个字节后检测io是否为低,为低说明传送数据错误
CALL DELAY1_0ETU
;LDCF A,(P6)
LDCF A,(cc_port)
JR C,SENDONETI
DJNZ W,REPSENDREADY
SET 2,(SAM_RACK)
;OR (SAM_RACK),0x04
SENDONETI:
RET ;重发超过3次,退出
REPSENDREADY:
LD B,(TEMP_BUFFER2)
CALL DELAY1_0ETU
CALL DELAY1_0ETU
JP REPSEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND_DATA: ;发送的数据长度为D+1,主要是少一个保护时间
ld E,(TC1) ;取接收到的TC1,即保护时间,单片机发送时,两个字符之间的延时个数计算
inc 1,E
;JR NZ,modify
JR NZ,SEND_DATA0
INC 1,E
;modify:
; ADD E,(tc_modify)
SEND_DATA0:
LD B,(XIX+)
CALL SEND_ONEBYTE
CP (SAM_RACK),0x00
JR Z,SENDCONTI
RET
SENDCONTI:
CALL DELAY1_01ETU
DJNZ E,SENDCONTI
DJNZ D,SEND_DATA
LD B,(XIX+)
CALL SEND_ONEBYTE
CP (SAM_RACK),0x00
JP NZ,EXIT_RET
RET
get_response:
LD (data_cmd),0x00
LD (CLA),0x00
LD (INS),0xC0
LD (COMMAND_p1),0x00
LD (COMMAND_p2),0x00
LD (COMMAND_p3),(TEMP_BUFFER1)
__COM_S_D: ;发送命令
;ldcf 4,(cc_pow_port)
;jp nc,EXIT_RET
call DELAY1_0ETU
call DELAY1_0ETU
call SET_W
ld XIX,CLA
;ld D,0x05
;SUB D,1
ld D,0x04
CALL SEND_DATA ;发送的数据长度为D+1
LD XIX,trans_recive_adr
RE_ONE:
CALL RES_ONEBYTE
CP (SAM_RACK),0x00
JP nz,EXIT_RET
LD (TEMP_BUFFER),D
CP D,0x60
JR Z,RE_ONE
CP D,(INS)
JR Z,RECIVE_OR_TRANS
XOR D,(INS)
CP D,0xFF
JP Z,single_byte_tr
LD D,(TEMP_BUFFER)
AND D,0xF0
CP D,0x60 ;0X6x
JR Z,RE_ONE2
CP D,0x90 ;0X90
JR NZ,RE_ONE3
RE_ONE2:
CALL RES_ONEBYTE
CALL DELAY1_0ETU
CALL DELAY1_0ETU
LD (TEMP_BUFFER1),D
CP (TEMP_BUFFER),0x61
JP Z,get_response
LD (COMMAND_p1),(TEMP_BUFFER)
LD (COMMAND_p2),(TEMP_BUFFER1)
RET
RE_ONE3:
LD (COMMAND_p1),0x6A
LD (COMMAND_p2),0x89
RET
single_byte_tr:
CALL DELAY0_5ETU
cp (data_cmd),0x00
jr z,single_recive
LD B,(XIX+)
CALL SEND_ONEBYTE
CP (SAM_RACK),0X00
JP Z,RE_ONE
RET
single_recive:
CALL RES_ONEBYTE
ld (XIX+),D
CP (SAM_RACK),0X00
JP z,RE_ONE
ret
RECIVE_OR_TRANS:
cp (data_cmd),0x00
jr z,RECIVE
;cp (INS),0x84
;jp z,RECIVE
;cp (INS),0xc0
;jp z,RECIVE
;cp (INS),0xb0
;jp z,RECIVE
;cp (INS),0xb2
;jp z,RECIVE
;cp (INS),0xf0
;jp z,RECIVE
;cp (INS),0xE9
;jp z,RECIVE
;*********************************************;
;CP (data_cmd),0x01 ;add
;JP z,RE_ONE ;titan
;*********************************************;
CALL DELAY1_0ETU
CALL DELAY1_0ETU
CALL DELAY1_0ETU
CALL DELAY1_0ETU
LD D,(COMMAND_p3)
SUB D,1
CALL SEND_DATA ;发送的数据长度为D+1
JP RE_ONE ;TITAN
;*********************************************;
CP (CLA),0x10 ;ADD
JR Z,CHANGE_DATA_CMD
JP RE_ONE
CHANGE_DATA_CMD:
LD (data_cmd),0x01
JP RE_ONE
;*********************************************;
RECIVE:
LD E,(COMMAND_p3)
RECIVE_DATA:
CALL RES_ONEBYTE
CP (SAM_RACK),0X00
JR Z,RECIVE_DATA1
RET
RECIVE_DATA1:
LD (XIX+),D
DJNZ E,RECIVE_DATA
JP RE_ONE
;***************SAM CARD OPERATION START*****************
__UPDATE_CONTROLS:
LD (data_cmd),0x01
LD (CLA),0Xc0
LD (INS),0Xf6
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x1d
jp __COM_S_D
__FISCAL_REGISTER:
GET_REGISTER_NB:
LD (data_cmd),0x00
LD (CLA),0Xc0
LD (INS),0Xf0
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x10
CALL __COM_S_D
cp (COMMAND_p1),0x90
jr z,REGISTER_SIGN
ret
REGISTER_SIGN: ;注册签字
LD (data_cmd),0x01
SET 7,(SAM_ASPE)
;OR (SAM_ASPE),0X80
LD (CLA),0Xc0
LD (INS),0Xe4
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x10
CALL __COM_S_D
cp (COMMAND_p1),0x90
jr z,TERMINAL_REGISTER
ret
TERMINAL_REGISTER: ;税控卡注册
LD (data_cmd),0x01
RES 7,(SAM_ASPE)
;AND (SAM_ASPE),0X7F
LD (CLA),0Xc0
LD (INS),0Xf1
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x04
JP __COM_S_D
__DATA_COLLECT: ;汇总申报数据
LD (data_cmd),0x01
LD (CLA),0Xc0
LD (INS),0Xe6
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0xdc
JP __COM_S_D
__DECLARE_DUTY: ;生成申报数据
LD (data_cmd),0x01
LD (CLA),0Xc0
LD (INS),0Xf4
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x47
JP __COM_S_D
__ISSUE_INVOICE: ;开票
LD (data_cmd),0x01
LD (CLA),0Xc0
LD (INS),0Xf2
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x2c
JP __COM_S_D
__VERIFY_FISCAL_PIN: ;效验使用口令
LD (data_cmd),0x01
LD (CLA),0Xc0
LD (INS),0XF9
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x08
JP __COM_S_D
__VERIFY: ;用于校验命令数据域的个人密码的正确性
LD (data_cmd),0x01
LD (CLA),0X00
LD (INS),0X20
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00;??leo这个是pin标识,正式使用时会不会变
JP __COM_S_D
__INPUT_INVOICE_NB: ;录入发票号
LD (data_cmd),0x01
LD (CLA),0Xc0 ;CLA
LD (INS),0XF7 ;INS
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x16
JP __COM_S_D
__DISTRIBUTE_INVOICE_NB: ;分发发票号
LD (data_cmd),0x00
LD (CLA),0Xc0 ;CLA
LD (INS),0Xe9 ;INS
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x16
JP __COM_S_D
__GET_CHALLENGE: ;命令请求一个相关过程的随机数
LD (data_cmd),0x00
LD (CLA),0X00 ;CLA
LD (INS),0X84 ;INS
LD (COMMAND_p1),0X00
LD (COMMAND_p2),0X00
LD (COMMAND_p3),0x08;leng
JP __COM_S_D
__EXTERNAL_AUTHENTICATION: ;外部认证;认证级别外部放入(COMMAND_p2)
LD (data_cmd),0x01
;LD (COMMAND_p2),0X00
LD (CLA),0X00 ;CLA
LD (INS),0X82 ;INS
LD (COMMAND_p1),0X00
LD (COMMAND_p3),0x08;leng
JP __COM_S_D
__INTERNAL_ATUHNTICATION: ;内部认证;认证级别外部放入(COMMAND_p2)
LD (data_cmd),0x01
;LD (COMMAND_p2),0X00
LD (CLA),0X00 ;CLA
LD (INS),0X88 ;INS
LD (COMMAND_p1),0X00
LD (COMMAND_p3),0x08;leng
JP __COM_S_D
__READ_RECORD: ;读记录,COMMAND_p1,COMMAND_p2,COMMAND_p3由外部设置
LD (data_cmd),0x00
LD (CLA),0X00 ;CLA
LD (INS),0Xb2 ;INS
JP __COM_S_D
__UPDATE_RECORD: ;修改记录COMMAND_p1,COMMAND_p3由外部设置
LD (data_cmd),0x01
LD (CLA),0X00
LD (INS),0XDC ;0xb2
LD (COMMAND_p2),0X04
JP __COM_S_D
__READ_BINARY: ;读2进制文件,COMMAND_p1,COMMAND_p2,COMMAND_p3由外部设置
LD (data_cmd),0x00
LD (CLA),0x00 ;CLA
LD (INS),0xB0 ;INS
JP __COM_S_D
__DAILY_COLLECT_SIGN: ;对日交易累计记录或其他数据签名,COMMAND_p2,COMMAND_p3由外部设置
LD (data_cmd),0x01
LD (CLA),0Xc0 ;CLA
LD (INS),0Xfb ;INS
LD (COMMAND_p1),0X00
JP __COM_S_D
__SELECTMF:
SELECT_MF: ;选择文件
LD (filename0),0X3F
LD (filename1),0X00
JP SELECT_FILECOM
__SELECTDF:
SELECT_DF: ;选择文件
LD (filename0),0X2F
LD (filename1),0X02
JP SELECT_FILECOM
__SELECT_EF01: ;选择文件
LD (filename1),0X01
JP __SELECT_EFCOM
__SELECT_EF02: ;选择文件
LD (filename1),0X02
JP __SELECT_EFCOM
__SELECT_EF03: ;选择文件
LD (filename1),0X03
JP __SELECT_EFCOM
__SELECT_EF04: ;选择文件
LD (filename1),0X04
JP __SELECT_EFCOM
__SELECT_EF05: ;选择文件
LD (filename1),0X05
JP __SELECT_EFCOM
__SELECT_EF06: ;选择文件
LD (filename1),0X06
JP __SELECT_EFCOM
__SELECT_EF07: ;选择文件
LD (filename1),0X07
JP __SELECT_EFCOM
__SELECT_EF08: ;选择文件
LD (filename1),0X08
__SELECT_EFCOM:
LD (filename0),0XEF
SELECT_FILECOM:
ld (data_cmd),0x01
ld (CLA),0x00 ;CLA
ld (INS),0xA4 ;INS
ld (COMMAND_p1),0x00
ld (COMMAND_p2),0x00
ld (COMMAND_p3),0x02
jp __COM_S_D
__SELECT_FILE01:
LD (FILENAME),0x01
JP SELECT_FILE
__SELECT_FILE02:
LD (FILENAME),0x02
JP SELECT_FILE
__SELECT_FILE03:
LD (FILENAME),0x03
JP SELECT_FILE
__SELECT_FILE04:
LD (FILENAME),0x04
JP SELECT_FILE
__SELECT_FILE05:
LD (FILENAME),0x05
JP SELECT_FILE
__SELECT_FILE06:
LD (FILENAME),0x06
JP SELECT_FILE
__SELECT_FILE07:
LD (FILENAME),0x07
JP SELECT_FILE
__SELECT_FILE08:
LD (FILENAME),0x08
SELECT_FILE: ;选择文件,INPUT:FILENAME=01,02,03,04,05,06,07,08,
CALL SELECT_MF
CALL DELAY1_0ETU
CALL DELAY1_0ETU
CALL SELECT_DF
CALL DELAY1_0ETU
CALL DELAY1_0ETU
LD (filename1),(FILENAME)
JP __SELECT_EFCOM
;***************SAM CARD OPERATION END*****************
IO_IN: ;I\0口设为输入
rcf ;2s
jr IO_COMM ;7s
IO_OUT: ;I\0口设为输出
scf
IO_COMM:
;stcf a,(P6CR_RAM) ;8s
;ld (P6CR),(P6CR_RAM) ;8s
stcf a,(PACR_RAM) ;8s
ld (PACR),(PACR_RAM) ;8s
ret ;11s
DELAY1_0ETU: ;etu=5+(6+4+7)*41+6+8+11+2=729s+call 14s=743s
LD (count_del),25 ;24-26;4s
FF1_0ETU:
DEC 1,(count_del) ;6s
JR Z,FF1_0RET ;8/4
JR FF1_0ETU
FF1_0RET:
NOP
NOP
RET ;11S
DELAY1_01ETU: ;etu=5+(6+4+7)*41+6+8+11+2=729s+call 14s=743s
LD (count_del),28 ;4s
FF1_01ETU:
DEC 1,(count_del) ;6s
JR Z,FF1_01RET ;8/4
JR FF1_01ETU
FF1_01RET:
RET ;11S
DELAY0_9ETU:
LD (count_del),24 ;23-25
FF0_9ETU:
DEC 1,(count_del)
JR Z,FF0_9RET
JR FF0_9ETU
FF0_9RET:
RET
DELAY0_5ETU:
LD (count_del),17 ;3-24
FF0_5ETU:
DEC 1,(count_del)
JR Z,FF0_5RET
JR FF0_5ETU
FF0_5RET:
RET
;DELAY200:
; LD W,26
;FF200:
; NOP
; DJNZ W,FF200
; RET
;
;DELAY40000:
; LD W,131
;DDDD:
; LD B,40
;
;DDD:
; NOP
; DJNZ B,DDD
; DJNZ W,DDDD
; RET
;------------sam end------------------------;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -