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

📄 card_cpuv21.inc

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 INC
📖 第 1 页 / 共 2 页
字号:
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 + -