📄 main.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 + -