📄 a1600.lst
字号:
< .external _RES_A04_ENC_SA;
< .external _RES_A04_ENC_EA;
< .external _RES_A05_ENC_SA;
< .external _RES_A05_ENC_EA;
< .external _RES_A06_ENC_SA;
< .external _RES_A06_ENC_EA;
< .external _RES_A07_ENC_SA;
< .external _RES_A07_ENC_EA;
< .external _RES_A08_ENC_SA;
< .external _RES_A08_ENC_EA;
< .external _RES_A09_ENC_SA;
< .external _RES_A09_ENC_EA;
<
< // End Table
.public T_SACM_A1600_Table;
.public F_SACM_DVR1600_Init_; // Hardware Setting
.public _IRQ2;
// Hasc_Kernel.asm reference Function
.external F_SACM_DVR1600_Init; //这个初始化,好象.asm文件中有的
.external F_SACM_DVR1600_IRQ_ServiceLoop; //怎么没有看到啊?
.external F_SACM_DVR1600_ServiceLoop; //执行DVR1600解码或编码操作
.external F_SACM_DVR1600_Volume; //设定DVR1600的播放音量
.external F_SACM_DVR1600_Status; //获取当前DVR1600录放音的状态
.external F_SACM_DVR1600_Pause; //暂停播放
.external F_SACM_DVR1600_Resume; //继续播放
.external HASC_FIFO;
.external HascDEC_FIFO_PTR;
.external _StatusData;
.external _toteldata;
//.external _aaaa;
// Purpose: DVR1600 Demo program for SPT6604
// : It can control Volume and VoiceIndex by Key.
//
//
//---------------------------
//语音播放时用到的单元
00000174 .RAM
00000174 00 00 DataRomAddr: .DW 0;
00000175 00 00 SegDataRomAddr: .DW 0;
00000176 00 00 W_InterRAM_Ptr: .DW 0;
00000177 00 00 DataFlag: .DW 0;
//-----------------------------
//程序调用他时候给的2个值单元地址
00000178 .RAM
00000178 00 00 R_SongIndex: .DW 0;
00000179 00 00 R_Volume: .DW 0;
//.PUBLIC F_SACM_DVR1600_SendDAC
//F_SACM_DVR1600_SendDAC: .PROC
0000996D .CODE
//.PUBLIC _FSpeech
// _F_Speech: .proc_
.public _InilSpeech
_InilSpeech: .proc
//PUSH BP to [sp];
0000996D A0 D8 PUSH R1 ,R4 to [SP]
0000996E 88 DA PUSH BP to [SP]
0000996F 08 0B 01 00 BP=sp+1;
00009971 07 92 R1=[BP+7];
00009972 19 D3 78 01 [R_SongIndex] = R1; //歌曲索引为0
00009974 08 92 R1=[BP+8]; //歌曲的音量
00009975 19 D3 79 01 [R_Volume]=R1;
//---IO口设置
00009977 11 93 0A 70 R1 = [P_IOC_Dir];
00009979 09 A3 40 00 R1|=0x40;
0000997B 19 D3 0A 70 [P_IOC_Dir] = R1; // IOC OutPut Mode
0000997D 11 93 08 70 R1=[P_IOC_Data];
0000997F 09 A3 40 00 R1|=0x40;
00009981 19 D3 08 70 [P_IOC_Data]=R1; //IOC 输出高电压
//---设置音量(0-15)共16级
00009983 11 93 79 01 R1=[R_Volume];
00009985 40 F0 60 99 CALL F_SACM_DVR1600_Volume;
//?Go_play:
00009987 40 92 R1 = 0;
00009988 19 D3 77 01 [DataFlag] = R1; //数据标志为0
0000998A 02 25 R2 -= R2;
0000998B 1A D5 76 01 [W_InterRAM_Ptr] = R2;
//---取语音索引号
0000998D 11 93 78 01 R1=[R_SongIndex];
0000998F 0D 9B 26 94 BP =offset T_SACM_A1600_Table;
00009991 01 0B BP+ =R1;
00009992 C5 9A BP=[BP];
//---For manual mode, fill the first 32 Data to HASC_FIFO
00009993 09 93 01 00 R1 = HASC_FIFO;
00009995 D5 94 R2 = [BP++];
00009996 C5 96 R3 = [bp]
00009997 5B 97 R3 = R3 LSL 4
00009998 5B 97 R3 = R3 LSL 4
00009999 4B 97 R3 = R3 LSL 2 //左移10位
0000999A 1B D7 75 01 [SegDataRomAddr] = R3
?_FillHASC_FIFO:
0000999C 0E BD FF 03 Sr &= 0x3FF //段寄存器 有程序段CS和数据段DS
0000999E 03 AD SR |= R3
0000999F E2 98 R4 =DS: [R2];
000099A0 41 04 R2 +=1
000099A1 04 4E JNZ ?L_Nover
000099A2 0B 07 00 04 R3 +=0x400
000099A4 1B D7 75 01 [SegDataRomAddr] = R3 //以上是放音频的基地址
?L_Nover:
000099A6 40 F0 3C 9A CALL F_ChangeHighLowByte; //将R4的高、低位互掉
000099A8 D1 D8 [R1++] = R4;
000099A9 09 43 21 00 CMP R1,HASC_FIFO+32;
000099AB 50 4E JNZ ?_FillHASC_FIFO;//以上可能是从新放置音频信息吧?
000099AC 1A D5 74 01 [DataRomAddr] = R2;
000099AE 09 93 FF FF R1 = 0xFFFF; // Voice Index , 0xFFFF means manual mode
000099B0 42 94 R2 = 2; // Volume Index, 0 ~ 3 .
000099B1 40 F0 83 96 call F_SACM_DVR1600_Init;//这个初始化,好象.asm文件中有的
000099B3 88 98 pop BP from[sp];
000099B4 A0 90 pop r1,r4 from[sp];
000099B5 90 9A RETF;
.endp
//---------------------------------
// 解码播放语音的主循环程序
//---------------------------------
?_play_loop:
?_wait_music_end:
000099B6 40 F0 22 96 CALL F_SACM_DVR1600_ServiceLoop; //03080 执行DVR1600解码或编码操作
000099B8 40 F0 07 9A CALL F_FillRingBuf; // For manual mode, users must fill the HASC_DEC_FIFO
000099BA 40 F0 68 99 CALL F_SACM_DVR1600_Status; //获取当前DVR1600录放音的状态
000099BC 41 C2 test R1, 0x0001; //Voice end ?
000099BD 48 4E JNZ ?_wait_music_end;
000099BE 42 C2 test R1,0x0002; // Voice Pause
000099BF 4A 4E JNZ ?_wait_music_end;
// call F_Stop_Play; //Stop playback DVR1600
//----------------------------
//定时器和ADC的设置
//----------------------------
//-----------------------------------------------------
// Set Fosc , TimerA or TimerB , TimerData , P_DAC_Ctrl
//-----------------------------------------------------
//F_SACM_DVR1600_Init_: //这个初始化,好象.asm文件中有的
// // PUSH R1,R5 TO [SP]
// INT OFF;
// R1 = 0x0081;
// [P_SystemClock] = R1; //Set High Speed and (/1)
// R1 = 0x0080;
// //R1|=[P_SystemClock];
// [P_SystemClock] = R1; //Set High Speed and (/1)
//
//// R1 = 0x04;
//// [P_IntClr]= R1;
//
// R1 = 0xD500; //Base 32768Hz
// [P_Tmr_Ctrl] = R1;
//
// R1 = 0xFFFC; // 8.192k
// [P_TmrA_Data] = R1; //Set play rate
// [P_TmrA_Load] = R1;
//
// R1 = 0x0004;
// R1|=[P_Int];
// [P_Int] = R1; //Enabel TimerA INT
//
// R1 = 0x0200; //From DACO pin
//// R1|=[P_DtmfTone];
// [P_DtmfTone] = R1;
//
// r1= [0x7022]
// r1 |= 0x0300 //OPEN 0x7022(P_DtmfTone_Def)REG 的 DACEN 和 Tone_DACO 两位
// [0x7022] =r1
//
//
// r1= [0x7026]
// r1 |= 0x1 //U_AFECtrl->B.EN_DAC2 =1;
// [0x7026] = r1
//
// INT IRQ; //IRQ ON;
// POP R1,R5 FROM [SP]
// RETF;
F_SACM_DVR1600_Init_: //这个初始化,好象.asm文件中有的
000099C0 40 F1 INT OFF;
000099C1 09 93 81 00 R1 = 0x0081;
000099C3 11 A3 15 70 R1|=[P_SystemClock];
000099C5 19 D3 15 70 [P_SystemClock] = R1; //Set High Speed and (/1)
000099C7 09 93 80 00 R1=0x80;
000099C9 19 D3 15 70 [P_SystemClock] = R1; //Set High Speed and (/1)
000099CB 44 92 R1 = 0x04;
000099CC 19 D3 11 70 [P_IntClr]= R1;
000099CE 09 93 00 D5 R1 = 0xD500;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -