serial.asm

来自「dsp tmslf2407a 汇编,c的原代码,包括i2c,scitimer,f」· 汇编 代码 · 共 1,590 行 · 第 1/2 页

ASM
1,590
字号
	LDPK	_status_rx
	LAC	_status_rx
	BNZ	L20
	.line	15
;>>>> 			 		len_rx = SCIRXBUF;  		             			             
	LDPK	_SCIRXBUF
	BLDD	_SCIRXBUF,#_len_rx
	.line	16
;>>>> 			        if((len_rx > 4)&&(len_rx <188))  //接收数至少要有5个字节
	LDPK	_len_rx
	ZALS	_len_rx
	SUBK	4
	BLEZ	L22
	ZALS	_len_rx
	SUBK	188
	BGEZ	L22
	.line	18
;>>>> 			        	p_rx = 0;
	LACK	0
	LDPK	_p_rx
	SACL	_p_rx
	.line	19
;>>>> 			            pcdata[0] = len_rx;
	LDPK	_len_rx
	BLDD	_len_rx,#_pcdata
	.line	20
;>>>> 			            status_rx = 1;
	LACK	1
	LDPK	_status_rx
	SACL	_status_rx
	.line	21
;>>>> 			            len_rx --; 
	LDPK	_len_rx
	LAC	_len_rx
	SUBK	1
	SACL	_len_rx
	.line	22
;>>>> 			            p_rx ++;			            
	LDPK	_p_rx
	LAC	_p_rx
	ADDK	1
	SACL	_p_rx
	B	L22
L20:
	.line	25
;>>>> 			    else if(status_rx == 1)
	LAC	_status_rx
	SUBK	1
	BNZ	L23
	.line	27
;>>>> 				   	pcdata[p_rx] = SCIRXBUF;
	LDPK	_p_rx
	LAC	_p_rx
	ADLK	_pcdata+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	BLKD	#_SCIRXBUF,* 
	.line	28
;>>>> 				    p_rx ++;
	LAC	_p_rx
	ADDK	1
	SACL	_p_rx
	.line	29
;>>>> 				    len_rx--;			
	LDPK	_len_rx
	LAC	_len_rx
	SUBK	1
	SACL	_len_rx
	.line	30
;>>>> 			        if(len_rx == 0)
	LAC	_len_rx
	BNZ	L22
	.line	32
;>>>> 			           	status_rx = 2;
	LACK	2
	LDPK	_status_rx
	SACL	_status_rx
	B	L22
L23:
	.line	35
;>>>> 			    else{rec=SCIRXBUF;}	//read to clear RXRDY flag	
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_SCIRXBUF,* 
L22:
	.line	36
;>>>> 			    IFR |= 0x01; 	    		    	
	LACK	1
	LDPK	_IFR
	OR	_IFR
	SACL	_IFR
	.line	37
;>>>> 	        	break;
;>>>> 			case 0x0001: 	//高优先级模式的外部引脚1中断
	B	L25
L26:
	.line	41
;>>>> 				if(simSerial == 0x06)delay52us();	//取电平的中间位置
	MAR	* ,AR2
	LARK	AR2,4
	MAR	*0+
	LAC	* 
	SUBK	6
	BNZ	L27
	CALL	_delay52us,AR1
	B	L28
L27:
	.line	42
;>>>> 				else if(simSerial == 0x07)delay26us();	
	LAC	* 
	SUBK	7
	BNZ	L29
	CALL	_delay26us,AR1
	B	L28
L29:
	.line	43
;>>>> 				else if(simSerial == 0x08)delay17us();	
	LAC	* 
	SUBK	8
	BNZ	L30
	CALL	_delay17us,AR1
	B	L28
L30:
	.line	44
;>>>> 				else  delay26us();		    
	CALL	_delay26us,AR1
L28:
	.line	46
;>>>> 				for(i=0;i<8;i++)//读取一个字节
	LACK	0
	MAR	* ,AR2
	LARK	AR2,3
	MAR	*0+
	SACL	* 
	ZALS	* 
	SUBK	8
	BGEZ	L32
	MAR	*+
L31:
	.line	48
;>>>> 					if(simSerial == 0x06)delay104us();	//位与位之间宽度	
	LAC	* 
	SUBK	6
	BNZ	L33
	CALL	_delay104us,AR1
	B	L37
L33:
	.line	49
;>>>> 					else if(simSerial == 0x07)delay52us();	
	LAC	* 
	SUBK	7
	BNZ	L35
	CALL	_delay52us,AR1
	B	L37
L35:
	.line	50
;>>>> 					else if(simSerial == 0x08)delay34us();	
	LAC	* 
	SUBK	8
	BNZ	L36
	CALL	_delay34us,AR1
	B	L37
L36:
	.line	51
;>>>> 					else  delay52us();					
;>>>> 					switch(i)
	CALL	_delay52us,AR1
	B	L37
L38:
	.line	54
;>>>> 						case 0:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x01;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	1
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L41:
	.line	55
;>>>> 						case 1:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x02;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	2
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L43:
	.line	56
;>>>> 						case 2:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x04;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	4
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L45:
	.line	57
;>>>> 						case 3:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x08;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	8
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L47:
	.line	58
;>>>> 						case 4:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x10;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	16
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L49:
	.line	59
;>>>> 						case 5:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x20;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	32
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L51:
	.line	60
;>>>> 						case 6:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x40;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	64
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L53:
	.line	61
;>>>> 						case 7:{if( (PCDATDIR&0x10) == 0x10 )rec |= 0x80;break;}
	LACK	16
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	MAR	* ,AR1
	SACL	* 
	SSXM
	LAC	* 
	SUBK	16
	BNZ	L40
	LACK	128
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	OR	* 
	SACL	* 
	B	L40
L37:
	.line	52
	MAR	* ,AR2
	LARK	AR2,3
	MAR	*0+
	ZALS	* ,AR0
	SUBK	7
	BGZ	L40
	ADDK	7
	BLZ	L40
	ADLK	LL10
	TBLR	*
	LAC	*
	BACC
	.sect	".switch"
LL10:
	.word	L38
	.word	L41
	.word	L43
	.word	L45
	.word	L47
	.word	L49
	.word	L51
	.word	L53
	.text
L40:
	.line	46
	MAR	* ,AR2
	LARK	AR2,3
	MAR	*0+
	LAC	* 
	ADDK	1
	SACL	* 
	ZALS	*+
	SUBK	8
	BLZ	L31
L32:
	.line	64
;>>>> 				if(rec == frameHeader)//判断帧头
	LARK	AR2,1
	MAR	*0+
	LAC	* 
	SUBK	126
	BNZ	L55
	.line	66
;>>>> 					sim_begin = 1;
	LACK	1
	LDPK	_sim_begin
	SACL	_sim_begin
	.line	67
;>>>> 					sim_end = 0;
	LACK	0
	LDPK	_sim_end
	SACL	_sim_end
	.line	68
;>>>> 					simConter = 0;
	LDPK	_simConter
	SACL	_simConter
	.line	69
;>>>> 					simdata[simConter] = rec;
	ADLK	_simdata+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR2
	LAC	* ,AR3
	SACL	* 
	.line	70
;>>>> 					simConter ++;								
	LAC	_simConter
	ADDK	1
	SACL	_simConter
	B	L56
L55:
	.line	72
;>>>> 				else if(rec == frameEnd)//判断帧尾
	LAC	* 
	SUBK	13
	BNZ	L56
	.line	74
;>>>> 					simdata[simConter] = rec;
	LDPK	_simConter
	LAC	_simConter
	ADLK	_simdata+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR2
	LAC	* ,AR3
	SACL	* 
	.line	75
;>>>> 					sim_begin = 0;
	LACK	0
	LDPK	_sim_begin
	SACL	_sim_begin
	.line	76
;>>>> 					sim_end = 1;
	LACK	1
	LDPK	_sim_end
	SACL	_sim_end
	.line	77
;>>>> 					simConter = 0;
	LACK	0
	LDPK	_simConter
	SACL	_simConter
L56:
	.line	79
;>>>> 				if( (sim_begin==1) && (sim_end==0) )
	LDPK	_sim_begin
	LAC	_sim_begin
	SUBK	1
	BNZ	L58
	LDPK	_sim_end
	LAC	_sim_end
	BNZ	L58
	.line	81
;>>>> 					simdata[simConter] = rec;
	LDPK	_simConter
	LAC	_simConter
	ADLK	_simdata+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR2
	LAC	* ,AR3
	SACL	* 
	.line	82
;>>>> 					simConter ++;			
	LAC	_simConter
	ADDK	1
	SACL	_simConter
L58:
	.line	84
;>>>> 				XINT1CR |= 0x8000;	//清除xint1 flag
	LALK	1,15
	LDPK	_XINT1CR
	OR	_XINT1CR
	SACL	_XINT1CR
	.line	86
;>>>> 	      	default:     { break;}       
	B	L25
L18:
	.line	8
	SSXM
	LDPK	_PIVR
	LAC	_PIVR
	SUBK	1
	BZ	L26
	SUBK	5
	BZ	L19
L25:
EPI0_7:
	.line	88
	MAR	* ,AR1
	SBRK	5
	B	I$$REST,AR1   ;and return

	.endfunc	207,000000000H,5

	.sym	_simInit,_simInit,32,2,0
	.globl	_simInit

	.func	208
;>>>> 	void simInit(void)
******************************************************
* FUNCTION DEF : _simInit
******************************************************
_simInit:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 		MCRA |= 0x0004;		// iopa2 as xint1
	LACK	4
	LDPK	_MCRA
	OR	_MCRA
	SACL	_MCRA
	.line	4
;>>>> 		XINT1CR &= 0xfff9;	//下降沿产生中断,高优先级
	LACK	65529
	LDPK	_XINT1CR
	AND	_XINT1CR
	SACL	_XINT1CR
	.line	5
;>>>> 		XINT1CR |= 0x0001;	//使能外部中断
	LACK	1
	OR	_XINT1CR
	SACL	_XINT1CR
	.line	6
;>>>> 		simRxdIn;		// 输入信号
	LACK	65519
	LDPK	_MCRB
	AND	_MCRB
	SACL	_MCRB
	LACK	61439
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	SACL	_PCDATDIR
	LACK	16
	OR	_PCDATDIR
	SACL	_PCDATDIR
	.line	7
;>>>> 		sc2_snt_0;		//接收使能
	LACK	65023
	LDPK	_MCRC
	AND	_MCRC
	SACL	_MCRC
	LACK	512
	LDPK	_PFDATDIR
	OR	_PFDATDIR
	SACL	_PFDATDIR
	LACK	65533
	AND	_PFDATDIR
	SACL	_PFDATDIR
EPI0_8:
	.line	8
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	215,000000000H,1

	.sym	_simOutput1byte,_simOutput1byte,32,2,0
	.globl	_simOutput1byte

	.func	216
;>>>> 	void simOutput1byte(uchar byte)//模拟串口输出一个字节
******************************************************
* FUNCTION DEF : _simOutput1byte
******************************************************
_simOutput1byte:

LF9	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,4
	LAR	AR0,*0+,AR2

	.sym	_byte,-3+LF9,12,9,16
	.sym	_i,1,12,1,16
	.sym	_temp,2,12,1,16
	.sym	_simSerial,3,14,1,16
	.line	2
;>>>> 		uchar i,temp;
;>>>> 		uint simSerial;
	.line	6
;>>>> 		simSerial = cfgdata[18] >> 8; 	
	RSXM
	LDPK	_cfgdata+18
	LAC	_cfgdata+18,7
	LARK	AR2,3
	MAR	*0+
	SACH	* ,1
	.line	7
;>>>> 		sc2_snt_1;	//发送时打开发送使能
	LACK	65023
	LDPK	_MCRC
	AND	_MCRC
	SACL	_MCRC
	LACK	514
	LDPK	_PFDATDIR
	OR	_PFDATDIR
	SACL	_PFDATDIR
	.line	8
;>>>> 		simTxdout1;	// txd =1;
	LACK	65503
	LDPK	_MCRB
	AND	_MCRB
	SACL	_MCRB
	LACK	8224
	LDPK	_PCDATDIR
	OR	_PCDATDIR
	SACL	_PCDATDIR
	.line	9
;>>>> 		simTxdout0;
	LACK	65503
	LDPK	_MCRB
	AND	_MCRB
	SACL	_MCRB
	LACK	65503
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	SACL	_PCDATDIR
	.line	11
;>>>> 		if(simSerial == 0x06)delay104us();	//开始位
	LAC	* 
	SUBK	6
	BNZ	L60
	CALL	_delay104us,AR1
	B	L61
L60:
	.line	12
;>>>> 		else if(simSerial == 0x07)delay52us();	
	LAC	* 
	SUBK	7
	BNZ	L62
	CALL	_delay52us,AR1
	B	L61
L62:
	.line	13
;>>>> 		else if(simSerial == 0x08)delay34us();	
	LAC	* 
	SUBK	8
	BNZ	L63
	CALL	_delay34us,AR1
	B	L61
L63:
	.line	14
;>>>> 		else  delay52us();
	CALL	_delay52us,AR1
L61:
	.line	16
;>>>> 		temp = 0x01;
	LACK	1
	MAR	* ,AR2
	LARK	AR2,2
	MAR	*0+
	SACL	*-
	.line	17
;>>>> 		for(i=0;i<8;i++)	//8位数据位
	LACK	0
	SACL	* 
	ZALS	* 
	SUBK	8
	BGEZ	L65
	MAR	*+
L64:
	.line	19
;>>>> 			if( byte&temp ){simTxdout1;}
	ZALS	* 
	SBRK	5-LF9
	AND	* 
	BZ	L66
	LACK	65503
	LDPK	_MCRB
	AND	_MCRB
	SACL	_MCRB
	LACK	8224
	LDPK	_PCDATDIR
	OR	_PCDATDIR
	SACL	_PCDATDIR
	B	L67
L66:
	.line	20
;>>>> 			else 		{simTxdout0;}
	LACK	65503
	LDPK	_MCRB
	AND	_MCRB
	SACL	_MCRB
	LACK	65503
	LDPK	_PCDATDIR
	AND	_PCDATDIR
	SACL	_PCDATDIR
L67:
	.line	22
;>>>> 			if(simSerial == 0x06)delay104us();	
	ADRK	6-LF9
	LAC	* 
	SUBK	6
	BNZ	L68
	CALL	_delay104us,AR1
	B	L69
L68:
	.line	23
;>>>> 			else if(simSerial == 0x07)delay52us();	
	LAC	* 
	SUBK	7
	BNZ	L70
	CALL	_delay52us,AR1
	B	L69
L70:
	.line	24
;>>>> 			else if(simSerial == 0x08)delay34us();	
	LAC	* 
	SUBK	8
	BNZ	L71
	CALL	_delay34us,AR1
	B	L69
L71:
	.line	25
;>>>> 			else  delay52us();
	CALL	_delay52us,AR1
L69:
	.line	27
;>>>> 			temp = temp << 1;
	MAR	* ,AR2
	LARK	AR2,2
	MAR	*0+
	LAC	* ,1
	SACL	*-
	.line	17
	LAC	* 
	ADDK	1
	SACL	* 
	ZALS	*+
	SUBK	8
	BLZ	L64
L65:
	.line	29
;>>>> 		simTxdout1;
	LACK	65503
	LDPK	_MCRB
	AND	_MCRB
	SACL	_MCRB
	LACK	8224
	LDPK	_PCDATDIR
	OR	_PCDATDIR
	SACL	_PCDATDIR
	.line	31
;>>>> 		if(simSerial == 0x06)delay104us();	//停止位	
	LARK	AR2,3
	MAR	*0+
	LAC	* 
	SUBK	6
	BNZ	L72
	CALL	_delay104us,AR1
	B	L73
L72:
	.line	32
;>>>> 		else if(simSerial == 0x07)delay52us();	
	LAC	* 
	SUBK	7
	BNZ	L74
	CALL	_delay52us,AR1
	B	L73
L74:
	.line	33
;>>>> 		else if(simSerial == 0x08)delay34us();	
	LAC	* 
	SUBK	8
	BNZ	L75
	CALL	_delay34us,AR1
	B	L73
L75:
	.line	34
;>>>> 		else  delay52us();	
	CALL	_delay52us,AR1
L73:
	.line	36
;>>>> 		delay104us();	//字节与字节之间延时
	CALL	_delay104us
	.line	37
;>>>> 		sc2_snt_0; 		//关闭发送使能
	LACK	65023
	LDPK	_MCRC
	AND	_MCRC
	SACL	_MCRC
	LACK	512
	LDPK	_PFDATDIR
	OR	_PFDATDIR
	SACL	_PFDATDIR
	LACK	65533
	AND	_PFDATDIR
	SACL	_PFDATDIR
EPI0_9:
	.line	38
	SBRK	5
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	253,000000000H,4
*****************************************************
* UNDEFINED REFERENCES                              *
*****************************************************
	.global	_crc16Calculate
	.global	I$$SAVE
	.global	I$$REST
	.end

⌨️ 快捷键说明

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