📄 dvr.asm
字号:
call F_SACM_DVR1600_Stop
R1 = 0
[RW_Flag] = R1
R1 = [RW_Long]
[RW_Length] = R1
GoTo ?l_PlayRecordLoop
////////////////////////////////////////////////
// keyscand and play internal ROM loop
///////////////////////////////////////////////
?L_PlayInternalROM:
R1 = 0
[RW_Flag] = R1
R1 = 0xF00
[P_DtmfTone] = R1
R4 = 0xFFFF-0x1c4 // 0x103 is 12k; 0x138 is 10k
//0xc4 is 16k ;0x186 is 8k 0x30d is 4k
//clock 29MHz/8 Rosc = 68K
//0x1c4 8k 0x192 9k 0x16a 10k 0x149 11k 0x12e 12k
// b5 a4
[P_TmrA_Data] = R4
[P_TmrA_Load] = R4
Call F_Play_Initial
r1 = 15;
call F_SACM_DVR1600_Volume; // set Volume ,15 max;
r1 = 0;
r2 = 3;
R3 = 0
call F_SACM_DVR1600_Play;
JMP ?PlayDVR1600ROMLoop
?l_PlayROMLoop:
R1 = 0
[RW_Flag] = R1
call F_Play_Initial
r1 = 15;
call F_SACM_DVR1600_Volume; // set Volume ,15 max;
r1 = 0;
r2 = 3;
R3 = 3
call F_SACM_DVR1600_Play;
?PlayDVR1600ROMLoop:
r1 = 0x55aa
[P_Watchdog_Clr] = r1 //Reset watchdog
call F_SACM_DVR1600_ServiceLoop; //write data from ADC to SDARM;
R1 = [RW_Flag]
Test R1, C_EndAddrFlag
JNZ ?AutoStopPlayROM
call F_KeyScand
R1 = [RW_KeyCode]
test R1,0xFF
JZ ?PlayDVR1600ROMLoop
?ExitPlayROMLoop:
call F_SACM_DVR1600_Stop
GoTo MainLoop
?AutoStopPlayROM:
call F_SACM_DVR1600_Stop
R1 = 0
[RW_Flag] = R1
R1 = [RW_Long]
[RW_Length] = R1
GoTo ?l_PlayROMLoop
////////////////////////////////////////////////
// keyscand and play S530 loop
///////////////////////////////////////////////
?L_PlayS530:
nop
nop
nop
// INT OFF;
// R1 = 0;
// [SpeechIndex] = R1
// [SpeedIndex] = R1 //MaxSpeedHalf;
// [R_SACM_S530_Play_Flag] = r1;
// R1 = 9;
// [VolumeIndex] = R1;
// // R1 = Auto
// R1 = Manual;
// [Mode] = R1;
// CMP R1, Auto;
// JE ?L_DealAutoMode;
//?L_DealManualMode:
////---------------------------------------;
// call F_System_Initial;
// call F_SACM_S530_Initial;
// R1 = 0;
// call F_USER_S530_SetStartAddr; // in sacm_user.asm
//
// r1 =-1;
// r2 =1;
// r3 =3
// call F_SACM_S530_Play; //Manual_Mode_Index=-1
// Goto ?PlayS530main_loop;
//
//?L_DealAutoMode:
////-----------------------------------------
// call F_System_Initial;
// call F_SACM_S530_Initial;
//// R1 = SpeechIndex
//// R2 = DAC
//// R3 = Ramp
//
// r1 =0;
// r2 =1;
// r3 =3
//
// call F_SACM_S530_Play;
//
////------------------------------------------
//?PlayS530main_loop:
// r1 = 0x55aa
// [P_Watchdog_Clr] = r1 //Reset watchdog
// call F_SACM_S530_ServiceLoop;
// Call F_System_ServiceLoop; // Service loop for Key Scanning
// call F_KeyScand
// R1 = [RW_KeyCode]
// test R1,0xFF
// JZ ?PlayS530main_loop
//
// call F_SACM_DVR1600_Stop
//?ExitPlayS530:
goto MainLoop
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
F_Record_Initial:
R1 =B_Enable32768+B_Strong32768+B_128Hz+B_8KHz
[P_TimeBaseSet] = R1;
R4 = 0xFFFF-0x1c4 // 0x103 is 12k; 0x138 is 10k
//0xc4 is 16k ;0x186 is 8k 0x30d is 4k
//clock 29MHz/8 Rosc = 68K
//0x1c4 8k 0x192 9k 0x16a 10k 0x149 11k 0x12e 12k
[P_TmrA_Data] = R4
[P_TmrA_Load] = R4
CALL F_MassErase;
R1 = 0x00
[P_DtmfTone] = R1
[RW_Length] = R1 // user length, may not use
[FlashAddrHi] = R1
R2 = 0x12 //1倍 //0x01//1/2 //0x16//5倍 //可以根据需要调节放大倍数
[P_AgcCtrl] = R2
r2 = 0x80
[P_AdcCtrl] = R2;
SR &=0x3FF
R1 = B_RecordBeginAddr+4 //DVR1600 length 0~3 byte
//the start address of data will begin from fourth byte
[RW_Address] = R1
// r1 = [P_Int];
// R1| = B_TmrAInt;
// [P_Int]=R1;
r1 = [P_Int];
R1| = B_Irq4;
[P_Int]=R1;
RETF
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
F_Play_Initial:
R1 =B_Enable32768+B_Strong32768+B_128Hz+B_16KHz
[P_TimeBaseSet] = R1;
R4 = 0xFFFF-0x0c4 // 0x103 is 12k; 0x138 is 10k
//0xc4 is 16k ;0x186 is 8k 0x30d is 4k
//clock 29MHz/8 Rosc = 68K
//0x1c4 8k 0x192 9k 0x16a 10k 0x149 11k 0x12e 12k
[P_TmrA_Data] = R4
[P_TmrA_Load] = R4
R1 = 0xF00
[P_DtmfTone] = R1
SR &=0x3FF
R1 = B_RecordBeginAddr
[RW_Address] = R1
r1 = [P_Int];
R1| = B_Irq4;
// R1| = B_Irq2;
[P_Int]=R1;
RETF
//
//--------------------------------------------
F_KeyScand:
PUSH R1,R5 TO [SP]
R1 = [RW_DebounceReg]
JZ L_DetectKey
JMP L_ExitKeyScand
L_DetectKey:
R1 = [P_IOA_Data]
R1 = [P_IOA_Data]
R1 = [P_IOA_Data]
R1 &= 0xFF
cmp R1,0xFF
jne L_KeyPressIn
JMP L_ExitKeyScand
L_KeyPressIn:
R2 = [RW_KeyBufOld]
JNZ L_AfterDebounceReg
[RW_KeyBufOld] = R1
R1 =15
[RW_DebounceReg] = R1
JMP L_ExitKeyScand
L_AfterDebounceReg:
R3 =50
[RW_DebounceReg] = R3
R3 = 0
[RW_KeyBufOld] =R3
R3 =R1 XOR 0xFF
CMP R1,R2
JE L_HaveKeyScand
L_ExitKeyScand:
R3 = 0
L_HaveKeyScand:
[RW_KeyCode]=R3
POP R1,R5 FROM [SP]
RETF
//****** for IRQ
//
// ======================================================================================
.text
_FIQ:
_IRQ1:
_IRQ3:
_IRQ5:
_IRQ7:
PUSH R1,R5 TO [SP]
R1 = 0xFFFF
[P_IntClr] = R1
POP R1,R5 FROM [SP]
RETI
_IRQ2:
push R1,R5 to [SP];
R1 = [P_IOB_Data]
R1 ^=0x0F
[P_IOB_Data] = R1
// call F_ISR_Service_SACM_DVR1600_FG; // use 8k samples
// call F_ISR_Service_SACM_S530;
R1 = B_TmrAInt;
[P_IntClr] = R1;
pop R1,R5 from [sp];
RETI;
_IRQ4:
PUSH R1,R5 TO [SP]
R1 = B_Irq4
[P_IntClr] = R1
call F_ISR_Service_SACM_DVR1600_FG; // use 8k samples
POP R1,R5 FROM [SP]
RETI
_IRQ6:
PUSH R1,R5 TO [SP]
R1 = B_Irq6
[P_IntClr] = R1
R1 = [RW_DebounceReg]
JZ L_ExitDec
R1-=1
[RW_DebounceReg] = R1
L_ExitDec:
POP R1,R5 FROM [SP]
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -