
//Ԫ
//ʼ:
//ָʱ N = F / BAUD

//Ϊ 11.059200M, 115200, ÿλռ 11059200 / 115200 = 96 ָʱ
//Ϊ 11.059200M, 76800, ÿλռ 11059200 / 76800 = 144 ָʱ
//Ϊ 11.059200M, 38400, ÿλռ 11059200 / 38400 = 288 ָʱ
//Ϊ 11.059200M, 19200, ÿλռ 11059200 / 19200 = 576 ָʱ
//Ϊ 11.059200M, 9600, ÿλռ 11059200 / 9600 = 1152 ָʱ
//Ϊ 11.059200M, 4800, ÿλռ 11059200 / 4800 = 2304 ָʱ
//Ϊ 11.059200M, 2400, ÿλռ 11059200 / 2400 = 4608 ָʱ
//Ϊ 11.059200M, 1200, ÿλռ 11059200 / 1200 = 9216 ָʱ

//=================================================================================
//V0
//: 2015.5.18

//;________________  start_1
//start_1:
//;________________ _0_local_uint16 0 local
//ldd r20,y+0	C2
//ldd r21,y+1	C2
//;________________ תݼ_uint16_uint16 0 0 end_1 local local
//movw r24,r20	C1
//tst r24		C1
//brne l17_1	C1/C2
//tst r25		C1
//brne l17_1	C1/C2
//jmp end_1		C2
//l17_1:
//sbiw r24,1	C2
//movw r20,r24	C1
//;________________ _0_local_uint16 0 local
//std y+0,r20	C2
//std y+1,r21	C2
//;________________  head_1
//head_1:
//;________________  continue_1
//continue_1:
//;________________ ת start_1
//jmp start_1	C2
//;________________  end_1
//end_1:
//ϱƶ, һ uint16 ݼloopռõĻ: 17 (ԵλΪ0ʱµжϸλΪ0ʱ, ΪС)

//2015.5.18
//Ŀǰ 38400 Լ², 76800

unit uart
{
	public const uint16 ID = 0;
	
	public link unit RXD {}
	public link unit TXD {}
	
	//[i] linkconst_int32_9600 baud;
	public const int32 baud = 9600;
	
	link bit RX_DIR = RXD.D0_DIR;
	link bit RX_OUT = RXD.D0_OUT;
	link bit RX_IN = RXD.D0_IN;
	
	link bit TX_DIR = TXD.D0_DIR;
	link bit TX_OUT = TXD.D0_OUT;
	
	uint16 BitTick;
	uint16 BitTick_D32;
	uint16 BitTick_C;
	
	[uint8*10] WBuffer;
	
	//---------------------------------------------------
	//ģʼ
	//[i] function_void OS_init;
	void OS_init()
	{
		//RX_DIR = 0;
		//RX_OUT = 1;
		
		TX_DIR = 1;
		TX_OUT = 1;
		
		set_baud( baud );
		
		WBuffer[0] = 0x7E;
		WBuffer[1] = 0xFF;
		WBuffer[2] = 0x06;	//Ŀ6
		WBuffer[3] = 0;		//
		WBuffer[4] = 0;		//0
		WBuffer[5] = 0;		//ݸλ
		WBuffer[6] = 0;		//ݸλ
		WBuffer[7] = 0;		//У͸λ
		WBuffer[8] = 0;		//У͵λ
		WBuffer[9] = 0xEF;
		
		st_Volume = 30;
		
		loop( 200 ) {
			loop( 200 ) {
				loop( 50 ) {
					
				}
			}
		}
	}
	//---------------------------------------------------
	//[i] function_void play int32;
	//
	public void play( int32 d1 )
	{
		send_command( 0x12, d1 / 256, d1 % 256 );
	}
	//---------------------------------------------------
	//[i] function_void continueplay;
	//
	public void continueplay()
	{
		send_command( 0x0D, 0, 0 );
	}
	//---------------------------------------------------
	//[i] function_void pause;
	//ͣ
	public void pause()
	{
		send_command( 0x0E, 0, 0 );
	}
	//---------------------------------------------------
	//[i] function_void stop;
	//ֹͣ
	public void stop()
	{
		send_command( 0x16, 0, 0 );
	}
	
	//---------------------------------------------------
	//[i] var_int32_w Volume;
	public mydata int32 Volume;
	int32 st_Volume;
	public memory mydata {}
	
	void set_uint32( uint32 d )
	{
		st_Volume = (int)d;
		
		int32 dd = st_Volume;
		if( dd < 0 ) dd = 0;
		if( dd > 30 ) dd = 30;
		
		send_command( 0x06, dd / 256, dd % 256 );
	}
	uint32 get_uint32()
	{
		return (uint)st_Volume;
	}
	
	//=================================================================================
	//[i] function_void send_command int32 int32 int32;
	//һ
	public void send_command( int32 c, int32 d1, int32 d2 )
	{
		WBuffer[3] = (uint8)(uint16)(uint)c;
		WBuffer[5] = (uint8)(uint16)(uint)d1;
		WBuffer[6] = (uint8)(uint16)(uint)d2;
		CheckSum();
		
		uint8 i = 0;
		loop( 10 ) {
			print_char( WBuffer[i] );
			i + 1;
		}
	}
	//---------------------------------------------------
	//ò
	//[i] function_void set_baud int32;
	public void set_baud( int32 b )
	{
		BitTick = (uint)(int16)($freq$ / b / 24);
		BitTick_C = BitTick - 3;
		BitTick_D32 = BitTick * 3 / 2;
	}
	
	//=================================================================================
	//У
	void CheckSum()
	{
		uint16 d = WBuffer[1];
		d + WBuffer[2];
		d + WBuffer[3];
		d + WBuffer[4];
		d + WBuffer[5];
		d + WBuffer[6];
		
		d = ~d + 1;
		WBuffer[7] = d.8(uint8);
		WBuffer[8] = d.0(uint8);
	}
	
	#include "$run$.txt"
}

public link unit SPEAKER1 {}
public link unit SPEAKER2 {}







