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

📄 main.asm

📁 SPT6608平台软件
💻 ASM
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////
//| 文件名:main.asm
//| 功  能:主文件模块,用来对各项功能进行集成。
//| 编码人:
//| 版  本:VAR 0.01
//| 时  间:2005.11.18
//| 修改历史:
////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////
//| 头文件
.include SPT6608.inc
.include main.h
.include function.h

////////////////////////////////////////////////////
//| 全局定义
.public _main;
.public _BREAK;
.public _FIQ;
.public _IRQ0;
.public _IRQ1;
.public _IRQ2;
.public _IRQ3;
.public _IRQ4;
.public _IRQ5;
.public _IRQ6;
.public _IRQ7;


.external	RW_Flag,RW_Address,RW_Temp1;
.external   T_SACM_DVR1600_SpeechTable,SinTab1024

.ram 
  
.var		RW_Length
.var		RW_CountAddr

.const  B_RecordBeginAddr  =  0x1000

////////////////////////////////////////////////////
//| 代码开始
.code
_main:
//初始化	
				INT OFF;							//关闭中断				
				R1 = 0x55AA;
				[P_Watchdog_Clr] = R1;				//清看门狗
				R2 = 0x0FFF;
				SP = R2;							//设置堆栈指针
				
//				CALL F_WakeUpCheck;					//检测系统是否是从休眠中唤醒
//				CMP R1, C_True
//				JE ?_main_WakeUp;
				
				//如果系统是冷启动
				CALL F_CPUInit;						//CPU硬件的一些初始化
				CALL F_PlatInit;					//软件的底层一些参数的初始化
				CALL F_ClearPlayRam;                //清除播放缓冲区 
//				JMP ?_main_init;					//调转到下一步处理
//系统是被从休眠中被唤醒的				
//?_main_WakeUp:
//				R1 = 0x0000;
//				[P_WakeUp] = R1;
//				R1 = 0xFFFF;
//				[P_WakeUpClr] = R1;			
//				CALL F_Restore;						//重新恢复休眠前的一些系统状态
//系统是被重新启动的
?_main_init:
                R1 = 0x0085;
				[P_SystemClock] = R1;	   
				
				INT FIQ, IRQ;						//允许中断
				CALL  F_TimerBEnable                //10s休眠处理
//消息循环
?_MsgLoop:

				CALL F_GetMessage;					//获取消息
				
				R1 = [R_MessageType];
				
				CMP R1, M_ComposePlay
				JE  ?_ComposePlay;					//合成播放处理
				CMP R1, M_PhrasePlay
				JE  ?_PhrasePlay;					//短语播放处理
				CMP R1, M_SoundPlay
				JE  ?_SoundPlay;					//声音播放处理

				CMP R1 , M_GoSleep
				JE  ?_CmdProc_GotoSleep
				JMP ?_MsgLoop;						//如果不是上述的几种消息
													//重新取消息
//合成播放				
?_ComposePlay:
				CALL F_ComposePlay;
				JMP ?_MsgLoop;
			
//短语播放
?_PhrasePlay:
				CALL F_PhrasePlay;
				JMP ?_MsgLoop;

//抬笔消息处理
?_SoundPlay:
				CALL F_SoundPlay;
				JMP ?_MsgLoop;

?_CmdProc_GotoSleep:
//				CALL F_UARTGotoSleep;
                CALL F_UARTGotoSleep1;
				JMP ?_MsgLoop;

////////////////////////////////////////////////////
//| 中断服务程序
.text
_BREAK:
				RETI

////////////////////////////////////////////////////
//| UART接收程序
_FIQ:
				PUSH R1, R5 TO [SP];
				//清UART中断标志,以便允许下载中断
				R1 = B_UARTInt;
				[P_IntClr] = R1;
				
				//检测是否有数据需要接收
				R1 = [P_UARTCmd2];
				TEST R1, B_RxRdy					
				JNZ ?_FIQ_HaveData
				GOTO  ?_FIQ_Quit1;                       //如果没有数据需要接收,直接跳出
?_FIQ_HaveData:				
				R1 = [P_UARTData];				    	//获取串口数据
				R1 &= 0x00FF;
		//test
//				nop
//				nop
//				nop
//				[P_UARTData] = R1
		//test						
				CMP R1,0x02
				JNE  ?_FIQ_Data1; 
				R2 = [R_ValidFrame]
				CMP R2 , C_True
				JE  ?_FIQ_Data1
				R1 = C_True;   
				[R_ValidFrame] = R1
				R1 = C_True;                            //初始化命令字为true
				[R_IsCmd] = R1;	
				R1 = C_False;                           //初始化接收参数为false
                [R_IsPara] = R1
?_FIQ_Quit1:
				GOTO  ?_FIQ_Quit;                        //如果接收到的数据是0xFF,唤醒指令
?_FIQ_Data1:
				R2 = [R_ValidFrame];
				CMP R2, C_True
				JNE  ?_FIQ_Quit1
?_FIQ_DataIsValid:
          		R2 = [R_IsCmd]	
          		CMP R2 , C_True	
                JNE  ?_FIQ_IsPara                       //如果命令为真,则接收命令
                //接到的数据是命令
?_FIQ_DataIsCmd:
				[R_CommandType] = R1;				    //将系统命令存放在R_CommandType中				
				CMP R1, M_StopPlay
				JE  ?_FIQ_DataIsCmdproc1				
				R1 = C_False;
				[R_IsCmd] = R1;					    	//下一次接收到的数据一定是命令参数,设置为C_False
                R1 = C_True;      
                [R_IsPara] = R1 
                JMP  ?_FIQ_Quit1;   
?_FIQ_IsPara:                
				R2 = [R_IsPara];
				CMP R2, C_True
				JNE ?_FIQ_IsData;					//数据是命令,跳转,退出
                CMP R1 , 0x80
                JBE  ?_FIQ_IsNumMax
                R1 = 0x80;
?_FIQ_IsNumMax:                
                [R_CharNum] = R1                    //备份数据长度
				[R_CommandValue] = R1;				//该数据为命令携带的参数,将其存放于R_CommandValue中
                R1 = C_False;
                [R_IsPara] = R1 
                R1 = 0
                [R_CurrentPos] = R1                   //初始化存储指针为数据区第一个字
                JMP  ?_FIQ_Quit1;	
		
?_FIQ_DataIsCmdproc1:
				R1 = [R_playnum]
				JZ  ?_FIQ_InvalidQuit
				CALL F_ClearMessage;
				R1 = C_True
				[R_StopSign] = R1
				R1 = 0;
				[R_playnum] = R1           //清等待播放条数
				R1 = [R_playnumtail]       //将播放消息的消息头和尾指向同一位置       
				[R_playnumhead] = R1
				R1 = [R_PlayName] 
				CMP R1 , C_True
				JNE  ?_UARTProc_StopName
				CALL  F_ChNameStop
				JMP  ?_FIQ_InvalidQuit
?_UARTProc_StopName:				
				CALL F_SACM_DVR1600_Stop;
				JMP  ?_FIQ_InvalidQuit
?_FIQ_IsData:							
				R2 = [R_CommandType]								
				R3 = R2 &0xF0;						//保留低字节,即命令				
				CMP R3, 0x30
				JNE  ?_UARTProc_RecvVolume
				CMP R2 , 0x32
				JA  ?_FIQ_InvalidQuit
				R2 = [R_playnum]
				CMP R2 , C_MaxPlayNum
				JB   ?_FIQ_DataGetPosition
?_FIQ_InvalidQuit:
				R2 = C_False;   
				[R_ValidFrame] = R2
				GOTO  ?_FIQ_Quit;
?_FIQ_DataGetPosition:			
				R2 = [R_playnumtail] 
				R3 = 65
				MR = R2 * R3
				BP = UartPlayBuffer
				BP += R3
				R2 = [R_CommandValue]               //播放缓冲区首地址
				[BP++] = R2                         //首个字存放播放长度
				JMP ?_UARTProc_Recv         		//接收合成命令参数
?_UARTProc_RecvVolume:
				CMP R2, M_VolumeSet
				JNE ?_UARTProc_RecvMultiVoice;		//接收音量参数
				BP = R_VolumeSet
				CMP R1 ,0x0F
				JA  ?_FIQ_InvalidQuit
				JMP ?_UARTProc_Recv	
?_UARTProc_RecvSetSilence:				
				CMP R2, M_SetSilenceTime
				JNE  ?_UARTProc_RecvSetSpace;		//接收静音时间
				BP = R_chartime
?_UARTProc_Recv5:
				R3 = [R_CharNum]
				CMP R3 , 2
				JE  ?_UARTProc_Recv4
				R2 = [BP]
				R2 = R2 LSL 4
				R2 = R2 LSL 4
				R2 |= R1 
				[BP] = R2
				R2 = C_False;   
				[R_ValidFrame] = R2
				GOTO ?_FIQ_DataIsCmdproc
?_UARTProc_Recv4:				
				[BP] = R1 
				R2 = [R_CharNum]
				R2 -= 1 
				[R_CharNum] = R2
?_FIQ_Quit2:
				GOTO  ?_FIQ_Quit;
?_UARTProc_RecvSetSpace:				
				CMP R2, M_SetSpaceTime
				JNE ?_UARTProc_RecvSetPlay;	           //接收间隔时间			
                BP = R_spacetime
                JMP ?_UARTProc_Recv5
?_UARTProc_RecvSetPlay:				
				CMP R2, M_SetPlayTime
				JNE ?_FIQ_InvalidQuit;	        		    //播放间隔时间			
                BP = R_playspacetime
                JMP ?_UARTProc_Recv5                
                									
?_UARTProc_RecvMultiVoice:
				CMP R2, M_bMultiVoiceMode
				JNE ?_UARTProc_RecvSetSilence;		//接收多音字参数
				BP = R_MultiMode
				CMP R1 , 0x01
				JBE  ?_UARTProc_Recv
				GOTO  ?_FIQ_InvalidQuit			
?_UARTProc_Recv:			
                R3 = [R_CurrentPos]
				R3 = R3 LSR 1
				BP += R3 
				R3 = [R_CurrentPos]
				TEST R3 , 0x01
				JZ	?_UARTProc_Recv1 		
				R1 = R1 LSL 4
				R1 = R1 LSL 4
				R2 = [BP]
				R1 |= R2
?_UARTProc_Recv1:
				[BP] = R1 
				R3 += 1                          //如果是ASCII码,直接保存,保存指针指向下一位置
				[R_CurrentPos] = R3
?_UARTProc_Recv3:								
				R2 = [R_CharNum]
				R2 -= 1
				[R_CharNum] = R2 ;				    //该数据为命令携带的参数,将其存放于R_CommandValue中
                CMP R2 , 0
                JNE  ?_FIQ_Quit
                R2 = C_False;   
				[R_ValidFrame] = R2
                R2 = [R_CommandType];
                R2 &= 0xF0
                CMP R2 , 0x30
                JNE  ?_FIQ_Quit            
                R2 = [R_playnum]
                R2 += 1
                [R_playnum] = R2
                R2 = [R_playnumtail]                //调整播放尾指针
                R2 += 1
                CMP R2 , C_MaxPlayNum
                JE ?_UARTProc_Playtail
                [R_playnumtail] = R2
                JMP  ?_FIQ_DataIsCmdproc
?_UARTProc_Playtail:				
				R2 = 0
				[R_playnumtail] = R2                //循环保存要播放的数据

?_FIQ_DataIsCmdproc:				
				//接收完了命令和命令参数,对其进行解析处理
				CALL F_UARTProc;
				JMP ?_FIQ_Quit;						
				
?_FIQ_Quit:
				POP R1, R5 FROM [SP];				
				RETI
				
_IRQ0:
				PUSH R1, R5 TO [SP];
				POP R1, R5 FROM [SP];		
				RETI	
_IRQ1:
				PUSH R1, R5 TO [SP];
				//清除ioa中断标志
				R1 = B_IoaInt;
				[P_IntClr] = R1;		
				POP R1, R5 FROM [SP];
				RETI
//////////////////////////////////////////////////////
_IRQ7:
				PUSH R1,R5 TO [SP]
				R1 = [P_IntClr]
				R1 |= B_T8HzInt
				[P_IntClr] = R1
				POP	R1,R5 FROM [SP]
				RETI
_IRQ2:
				PUSH	R1,R5 TO [SP]
				R1 = B_Irq2
				[P_IntClr] = R1
				R1 = [R_PlayName] 
				CMP R1 , C_True
				JE  ?_IsChNameIrq2				
		    	call F_ISR_Service_SACM_DVR1600_FG;
		    	JMP ?_Irq2_Quit
?_IsChNameIrq2:
		    	call F_ISR_Service_ChName;
?_Irq2_Quit:				
				POP	R1,R5 FROM [SP]
				RETI
_IRQ4:
				PUSH	R1,R5 TO [SP]
				R1 = B_Irq4
				[P_IntClr] = R1;							
				POP	R1,R5 FROM [SP]
				RETI
_IRQ3:
				PUSH R1,R5 TO [SP]
				R1 = [P_IntClr]
				R1 |= B_Irq3
				[P_IntClr] = R1
				R1 = [R_SleepAdd]
				R1 += 1
				[R_SleepAdd] = R1
				CMP R1 , 3
				JB  ?_Irq3_Quit
				R1 = 0
				[R_SleepAdd] = R1
				R1 = M_GoSleep
				CALL F_PostMessage
				CALL F_TimerBDisable
?_Irq3_Quit:				 
				POP	R1,R5 FROM [SP]		        
		        RETI
_IRQ5:  
                PUSH  R1,R5 TO [SP]
                POP R1, R5 FROM [SP];		
                RETI
_IRQ6:
				PUSH	R1,R5 TO [SP]
				R1 = B_Irq6
				[P_IntClr] = R1
				POP	R1,R5 FROM [SP]
				RETI		        
        		

.END

⌨️ 快捷键说明

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