www.pudn.com > Midimidim.rar > MidiPlay.asm


.public F_SACM_MS02_Init_ 
.public T_SACM_MS02_SongTable 
.public T_SACM_MS02_InstrumentSet 
 
//---------------------------------------------------------------------------------------- 
//File Name:		MidiPlay.asm 
//Applied Body:		SPT6604A 
//Description:		This is a Demo code of MIDI play for SPT6604A 
//Compile:		Sunplus u'nSP IDE 
//Current Version:	V1.0 
//Written Date:		2002/11/27 
//---------------------------------------------------------------------------------------- 
 
//---------------------------------------------------------------------------------------- 
// Variable define 
.OSRAM 
//---------------------------------------------------------------------------------------- 
ShareArea1:		.dw			64  dup(0) 
//---------------------------------------------------------------------------------------- 
 
//---------------------------------------------------------------------------------------- 
.ORAM 
ShareArea2:		.dw			126  dup(0) 
 
EndOfMidiSram:		.dw			0 
//---------------------------------------------------------------------------------------- 
 
 
//---------------------------------------------------------------------------------------- 
.RAM 
PhoneMode:		.dw			0 
.const			Flag_PlayMidi		= 0x8000 
SongIndex:		.dw			0 
Volume:		.dw			0 
 
 
 
 
.const			StackBottom		= 0x05FF 
 
 
//============================== Midi Player External Function ===============================================// 
.external		F_ISR_Service_SACM_MS02 
.external		F_SACM_MS02_Volume  
.external		F_SACM_MS02_Initial 
.external		F_SACM_MS02_Play 
.external 		F_SACM_MS02_Status 
.external 		F_SACM_MS02_ServiceLoop 
.external		F_SACM_MS02_Stop 
 
//---------------------------------------------------------------------------------------- 
.include		Resource.inc 
.include		SPT6605.inc 
//.include		..\Function\Display.ASM 
.include		Keyscan.ASM 
//---------------------------------------------------------------------------------------- 
 
//---------------------------------------------------------------------------------------- 
.const			C_SongTotal		= 8 
.const			C_TopVolume		= 0x0003 
.const			C_KeyVolumeUp		= C_Delete 
.const			C_KeyVolumeDown		= C_Dummy 
//---------------------------------------------------------------------------------------- 
//---------------------------------------------------------------------------------------- 
.Code 
//---------------------------------------------------------------------------------------- 
 
.public _main; 
.public _FIQ; 
.public _IRQ0; 
.public _IRQ1; 
.public _IRQ2; 
.public _IRQ3; 
.public _IRQ4; 
.public _IRQ5; 
.public _IRQ6; 
.public _IRQ7; 
.public _BREAK; 
 
 
_main: 
	int	off 
	r1 =	0x55aa 
	[P_Watchdog_Clr] = r1			//Reset watchdog 
 
	sp =	StackBottom			//Initialize stack 
 
	r1 =	B_128Hz+B_512Hz+B_Enable32768 
	[P_TimeBaseSet] = r1			//Initialize timebase for key scan 
 
	r1 =	0x0000 
	[P_IOA_Dir] = r1			//Set IOA as input port 
 
	r1 =	0x001f 
	[P_IOB_Dir] = r1			//Set IOB0~IOB4 as output ports 
						//    IOB5~IOB7 as input ports 
	r1 =	0x1f00 
	[P_IOA_PullR] = r1			//Enable the pull-up resistor for IOA0~IOA4 
 
	r1 =	B_512HzInt 
	[P_Int] = r1 
 
	int	fiq,irq 
 
	call	F_StartKeyScan			//Start key scan 
 
	r1 =	0x0002 
	[Volume] = r1 
	r1 =	0x0001 
	[SongIndex] = r1 
     	[PhoneMode] = r1 
     	 
     	R1 = 	C_HandFree;			// Play the first song after CPU Power-on 
     	CALL	F_ModeSelectKeyDeal; 
//----------------------------------------------------------------------------------------	  
?L_MainLoop: 
	r1 =	0x55aa 
	[P_Watchdog_Clr] = r1 
	call	F_KeyScan 
	call	F_KeyDeal 
	call	F_PlayMidi 
	jmp	?L_MainLoop 
//---------------------------------------------------------------------------------------- 
F_PlayMidi: 
	r1 =	[PhoneMode] 
	test	r1,Flag_PlayMidi 
	jz	?L_PlayMidiOver 
 
	call	F_SACM_MS02_ServiceLoop 
	call	F_SACM_MS02_Status 
	test	r1, 0x0001			//Is song over? 
	jnz	?L_PlayMidiOver			//No, function return 
 
	call    F_StopPlay			//Yes, stop play 
 
	r1 =	C_ModeSelectMode		//Set select mode for key deal 
	r1&=	C_ModeRelatedBits 
	r2=	[PhoneMode] 
	r2&=	0xffff-C_ModeRelatedBits 
	r2|=	r1 
	[PhoneMode] = r2 
 
?L_PlayMidiOver: 
	retf 
 
 
//---------------------------------------------------------------------------------------- 
F_KeyDeal: 
	R2 =	[KeyQueueBufPtr] 
	test	r2,0x0f00		//Check if have key in key buffer 
	jnz	?L_KeyValueNotNull	 
	goto	?L_KeyDealOver		//No, key deal over 
?L_KeyValueNotNull: 
	r2&=	0x000f			//Yes, get key pointer 
//---------------------------------------------------------------------------------------- 
	r3 =	r2 lsr 1		//Get key Value from key buffer 
	r3+=	KeyQueueBuf 
	r1 =	[r3] 
	test	r2,0x0001 
	jz	?L_KeyValueOk 
	r1 =	r1 lsr 4 
	r1 =	r1 lsr 4 
?L_KeyValueOk: 
	r1&=	0x00ff 
//---------------------------------------------------------------------------------------- 
	r2 =	[KeyQueueBufPtr]	//Shift key buffer pointer to 
	r2+=	0x0001			//next key value 
	r2-=	0x0100 
	r2&=	0xfff7 
	[KeyQueueBufPtr] = r2 
//---------------------------------------------------------------------------------------- 
	r2 =	[PhoneMode] 
	r2&=	C_ModeRelatedBits 
	r2+=	TW_PhoneMode 
	pc =	[r2] 
?L_KeyDealOver: 
	retf 
 
 
//---------------------------------------------------------------------------------------- 
.const		C_ModeRelatedBits	= 0x0001 
.const		C_ModeSelectMode	= 0x0000 
.const		C_MidiPlayMode		= 0x0001 
TW_PhoneMode: 
	.dw	F_ModeSelectKeyDeal 
	.dw	F_PlayMidiModeKeyDeal 
//---------------------------------------------------------------------------------------- 
F_ModeSelectKeyDeal: 
	cmp	r1,C_HandFree 
	jnz	?L_NotKeyDel 
	 
	r1 =	0x0001				// play_rate : 32768/2 
	r2 =	0x0006				// channel_num 
	call    F_SACM_MS02_Initial 
 
	r1 =	[SongIndex]			// Song_Index 
	r2 =	[Volume]			// Volume : 0~3 
	call	F_SACM_MS02_Play		//Start play MIDI (Song_Index) 
	 
	r1 =	[PhoneMode] 
	r1|=	Flag_PlayMidi 
	[PhoneMode] = r1 
	 
	r1 =	C_MidiPlayMode			//Set MIDI play mode for key deal 
	r1&=	C_ModeRelatedBits 
	r2 =	[PhoneMode] 
	r2&=	0xffff-C_ModeRelatedBits 
	r2|=	r1 
	[PhoneMode] = r2 
?L_NotKeyDel: 
	retf 
//---------------------------------------------------------------------------------------- 
 
//---------------------------------------------------------------------------------------- 
F_PlayMidiModeKeyDeal: 
	cmp	r1,C_KeyVolumeUp 
	jnz	?L_NotKeyVolumeUp 
	r1 =	[Volume] 
	r1+=	0x0001 
	cmp	r1,C_TopVolume 
	jbe	?L_VolumeOk 
	r1 =	C_TopVolume 
?L_VolumeOk: 
	[Volume] = r1 
	call	F_SACM_MS02_Volume		// Adjust Volume 
	goto	?L_KeyDealOver 
?L_NotKeyVolumeUp: 
//---------------------------------------------------------------------------------------- 
	cmp	r1,C_KeyVolumeDown 
	jnz	?L_NotKeyVolumeDown 
	r1 =	[Volume] 
	jz	?L_VolumeOk 
	r1-=	0x0001 
	jmp	?L_VolumeOk 
?L_NotKeyVolumeDown: 
//---------------------------------------------------------------------------------------- 
	cmp	r1,C_Up 
	jnz	?L_NotKeyUp 
	r1 =	[SongIndex] 
	r1+=	0x0001 
	cmp	r1,C_SongTotal 
	jb	?L_SongIndexOk 
	r1 =	C_SongTotal-1 
?L_SongIndexOk: 
	[SongIndex] = r1 
 
	r1 =	[SongIndex]			// Song_Index 
	r2 =	[Volume]			// Volume : 0~3 
	call	F_SACM_MS02_Play		// Start play MIDI (Song_Index) 
 
	goto	?L_KeyDealOver 
?L_NotKeyUp: 
//---------------------------------------------------------------------------------------- 
	cmp	r1,C_Down 
	jnz	?L_NotKeyDown 
	r1 =	[SongIndex] 
	jz	?L_SongIndexOk 
	r1-=	0x0001 
	jmp	?L_SongIndexOk 
?L_NotKeyDown: 
//---------------------------------------------------------------------------------------- 
	cmp	r1,C_HandFree 
	jnz	?L_NotKeyDel 
	 
	call	F_StopPlay			//Stop play MIDI 
	 
	r1 =	C_ModeSelectMode		//Set select mode for key deal 
	r1&=	C_ModeRelatedBits 
	r2=	[PhoneMode] 
	r2&=	0xffff-C_ModeRelatedBits 
	r2|=	r1 
	[PhoneMode] = r2 
?L_NotKeyDel: 
//---------------------------------------------------------------------------------------- 
?L_KeyDealOver: 
	retf 
//---------------------------------------------------------------------------------------- 
 
//---------------------------------------------------------------------------------------- 
 
 
//---------------------------------------------------------------------------------------- 
// Function Name:	F_SACM_MS02_Init_ 
// Purpose:		Initialize related hardware 
//			(Set Fosc , TimerA or TimerB , TimerData , P_DAC_Ctrl) 
// Parameters:		None 
//---------------------------------------------------------------------------------------- 
F_SACM_MS02_Init_: 
	int	off 
 
	r1 =	0x0081 
	[P_SystemClock] = r1			//Set High Speed and (/1) 
 
	r1 =	0x0080 
	[P_SystemClock] = r1			//Set High Speed and (/1) 
 
	r1 =	0xffff 
	[P_IntClr] = r1 
 
	r1 = 0xD500				//Base 32768Hz 
	[P_Tmr_Ctrl] = r1 
 
	R1 = 0xFFFE				// 16.384k 
	[P_TmrA_Data] = r1			//Set play rate 
	[P_TmrA_Load] = r1 
 
	r1 =	[P_Int] 
	r1|=	B_TmrAInt 
	[P_Int]	= r1				//Enable TimerA interrupt 
 
	R1 = 0x0700				//From DACO pin 
	[P_DtmfTone] = r1 
 
	int	fiq, irq 
	retf 
//---------------------------------------------------------------------------------------- 
 
//---------------------------------------------------------------------------------------- 
// Function Name:	F_StopPlay 
// Purpose:		Stop playing MIDI 
//			(Clear Flag, Disable TimerA and INT) 
// Parameters:		None 
//---------------------------------------------------------------------------------------- 
F_StopPlay: 
	call	F_SACM_MS02_Stop 
 
	r1 =	0xFFFF 
	[P_IntClr] = r1 
 
	r1 =	0x0000			//Disable TimerA 
	[P_Tmr_Ctrl] = r1 
 
	r1 = 	0x0000			//Disable DAC 
	[P_DtmfTone] = r1 
 
	r1 = 	[P_Int] 
	r1&=	0xffff-0x0004 
	[P_Int]	= r1			//Disable TimerA INT 
 
	retf 
//---------------------------------------------------------------------------------------- 
 
 
.TEXT 
//---------------------------------------------------------------------------------------- 
//ISR : TimerA INT 
//---------------------------------------------------------------------------------------- 
_FIQ:	 
	push	r1,r5 to [sp] 
	r1=	B_Ioc1Int 
	[P_IntClr] = r1 	 
	pop	r1,r5 from [sp] 
	reti  
//------------------------------------------------------------------------------ 
_IRQ0:	 
	push	r1,r5 to [sp]  
	r1=	B_Ioc0Int+B_RiInt 
	[P_IntClr] = r1 
	pop	r1,r5 from [sp]  
	reti 
//------------------------------------------------------------------------------ 
_IRQ1:	 
	push	r1,r5 to [sp] 
	r1 =	B_IoaInt 
	[P_IntClr] = r1 
	pop	r1,r5 from [sp] 
	reti  
//------------------------------------------------------------------------------ 
_IRQ2:	 
	push r1,r5 to [sp] 
	r1=	B_TmrAInt 
	[P_IntClr] = r1 
	call	F_ISR_Service_SACM_MS02 
	pop	r1,r5 from [sp] 
	reti  
//------------------------------------------------------------------------------ 
_IRQ3: 
	push	r1,r5 to [sp] 
	r1 = 	B_TmrBInt 
	[P_IntClr] = r1 
	pop	 r1,r5 from [sp] 
	reti  
//------------------------------------------------------------------------------ 
_IRQ4: 
	push	r1,r5 to [sp] 
	r1 = 	B_T32KHzInt 
	[P_IntClr] = r1 
	pop	 r1,r5 from [sp] 
	reti 
//------------------------------------------------------------------------------ 
_IRQ5: 
	push	r1,r5 to [sp]  
	r1=	B_T2KHzInt  
	[P_IntClr] = r1 
	 
	call	F_KeyTimerService 
	 
	pop	r1,r5 from [sp]  
	reti  
//------------------------------------------------------------------------------ 
_IRQ6: 
	push	r1,r5 to [sp]  
	r1 =	B_T128HzInt  
	[P_IntClr] = r1 
	pop	r1,r5 from [sp]  
	reti  
//------------------------------------------------------------------------------ 
_IRQ7: 
 	push	r1,bp to [sp] 
	r1=	B_T8HzInt 
	[P_IntClr] = r1 
	pop	r1,bp from [sp]  
	reti  
//------------------------------------------------------------------------------ 
_BREAK: 
	reti 
//------------------------------------------------------------------------------ 
//---------------------------------------------------------------------------------------- 
T_SACM_MS02_SongTable: 
.DW _RES_01_SA; 
.DW _RES_04N_SA; 
.DW _RES_ALISOK_SA; 
.DW _RES_ARMYN_SA; 
.DW _RES_CUCKOO_SA; 
.DW _RES_K525_SA; 
.DW _RES_LADEN_SA; 
.DW _RES_TURKEY_SA; 
 
T_SACM_MS02_InstrumentSet: 
   .dw _RES_INSTRUMENT_SA 
 
 
//----------------------------------------------------------------------------------------