
unit tone
{
	public link unit SOUND {}
	
	link unit MCU {} = #.MEGA328;
	
	
	//[i] var_uint8 vol1;
	uint8 vol1;
	//[i] var_uint16 freq1;
	uint16 freq1;
	
	//[i] var_uint8 vol2;
	uint8 vol2;
	//[i] var_uint16 freq2;
	uint16 freq2;
	//[i] var_bool Start1;
	bool Start1;
	//[i] var_bool Start2;
	bool Start2;
	
	uint16 value1;
	uint16 value2;
	uint16 angle1;
	uint16 angle2;
	
	//---------------------------------------------------
	//[i] function_void OS_init;
	void OS_init()
	{
		angle1 = 0;
		value1 = 0;
		vol1 = 255;
		freq1 = 500;
		Start1 = false;
	
		angle2 = 0;
		value2 = 0;
		vol2 = 255;
		freq2 = 500;
		Start2 = false;
	
		SOUND.D0_DIR = 1;
		SOUND.D0_OUT = 0;
		timer_init();
	}
	//---------------------------------------------------
	//ʱʼ
	// 11.0592MHz, ƵΪ1, ƵΪ 11059200Hz
	//ֵΪ 256
	//жƵΪ 11059200Hz / 256 = 43200Hz
	void timer_init()
	{
		//ģʽ
		MCU.TCCR2A = 0B1000_0011;
		MCU.TCCR2B = 0B0000_0001;
		//ʼ
		MCU.OCR2A = 0;
		//ж
		MCU.TIFR2 | 0b0000_0001;
		//ʹж
		MCU.TIMSK2 | 0b0000_0001;
	}
	//---------------------------------------------------
	//жϷ
	
	link uint8 OCR2A = MCU.OCR2A;
	uint16 PWM;
	
	interrupt [MCU.WATCH.TIMER2_OVF]
	void TIMER2_OVF()
	{
		//˫ͨƵ(Чʹ޷)
//		if Start1;
//			value1 + 1;
//			if value1 >= vol1; Start1 = NO.
//		OK.
//		if Start2;
//			value2 + 1;
//			if value2 >= vol2; Start2 = NO.
//		OK.
//		angle1 + freq1;
//		angle1 8(uint8) = angle1 8(uint8) & 0B0111_1111;
//		PWM = value1 * WAVE (angle1 8(uint8));
//		angle2 + freq2;
//		angle2 8(uint8) = angle2 8(uint8) & 0B0111_1111;
//		PWM + value2 * WAVE (angle2 8(uint8));
//		PWM >> 1;
//		MCU OCR2 = PWM 8(uint8);
	
	
	
	
		//Ϊȼ۵ĻƵ,
		//С256˫ͨĲϳ
	
//	if Start1;
//		value1 + 1;
//		if value1 == 255; Start1 = NO.
//	OK.
		#asm "LDS r31,&Start1"
		#asm "sbrs r31,7"
		#asm "jmp @1_end"
		#asm "LDS r31,&value1"
		#asm "INC r31"
		#asm "STS &value1,r31"
		#asm "LDS r30,&vol1"
		#asm "CP r31,r30"
		#asm "BRLO @1_end"
		#asm "LDI r31,0"
		#asm "STS &Start1,r31"
		#asm "@1_end:"
//	if Start2,
//		value2 + 1,
//		if value2 == 255, Start2 = NO.
//	OK.
		#asm "LDS r31,&Start2"
		#asm "sbrs r31,7"
		#asm "jmp @2_end"
		#asm "LDS r31,&value2"
		#asm "INC r31"
		#asm "STS &value2,r31"
		#asm "LDS r30,&vol2"
		#asm "CP r31,r30"
		#asm "BRLO @2_end"
		#asm "LDI r31,0"
		#asm "STS &Start2,r31"
		#asm "@2_end:"
//	angle1 + freq1,
//	angle1 8(N8) = angle1 8(N8) & 0B0111_1111,
		#asm "LDS r31,&angle1"
		#asm "LDS r30,&freq1"
		#asm "ADD r31,r30"
		#asm "STS &angle1,r31"
		#asm "LDS r31,&angle1+1"
		#asm "LDS r30,&freq1+1"
		#asm "ADC r31,r30"
		#asm "ANDI r31,0x7F"
		#asm "STS &angle1+1,r31"
//	PWM = value1 * WAVE (angle1 8(N8)),
		#asm "LDS r26,&angle1+1"
		#asm "LDI r27,0x00"
		#asm "LDI r30,&WAVE4%256"
		#asm "LDI r31,&WAVE4/256"
		#asm "ADD r30,r26"
		#asm "ADC r31,r27"
		#asm "LPM r22,Z"
		#asm "LDS r23,&value1"
		#asm "MULSU r22,r23"
		#asm "STD y+&PWM,r0"
		#asm "STD y+&PWM+1,r1"
//	angle2 + freq2,
//	angle2 8(N8) = angle2 8(N8) & 0B0111_1111,
		#asm "LDS r31,&angle2"
		#asm "LDS r30,&freq2"
		#asm "ADD r31,r30"
		#asm "STS &angle2,r31"
		#asm "LDS r31,&angle2+1"
		#asm "LDS r30,&freq2+1"
		#asm "ADC r31,r30"
		#asm "ANDI r31,0x7F"
		#asm "STS &angle2+1,r31"
//	PWM + value2 * WAVE (angle2 8(N8)),
		#asm "LDS r26,&angle2+1"
		#asm "LDI r27,0x00"
		#asm "LDI r30,&WAVE4%256"
		#asm "LDI r31,&WAVE4/256"
		#asm "ADD r30,r26"
		#asm "ADC r31,r27"
		#asm "LPM r22,Z"
		#asm "LDS r23,&value2"
		#asm "MULSU r22,r23"
		#asm "LDD r30,y+&PWM"
		#asm "LDD r31,y+&PWM+1"
//	зΪ޷2
//	PWM >> 1;
//	MCU OCR2 = PWM 8(uint8);
		#asm "LDI r22,128"
		#asm "ADD r31,r22"
		#asm "ADD r1,r22"
		#asm "ADD r31,r1"
		#asm "ROR r31"
		#asm "STS &OCR2A,r31"
	}
	//---------------------------------------------------
	
	//г
	[#.code int8*128] WAVE0 =
	[
		  0, 17, 34, 49, 63, 75, 84, 91, 95, 97, 96, 93, 88, 82, 76, 68,
		 61, 54, 47, 42, 37, 33, 31, 29, 28, 28, 27, 27, 27, 27, 27, 26,
		 25, 24, 22, 20, 18, 16, 15, 13, 12, 11, 11, 10, 10, 10, 10, 10,
		 10, 10,  9,  9,  8,  7,  6,  4,  3,  2,  1,  1,  0,  0,  0,  0,
		  0,  0,  0,  0,  0, -1, -1, -2, -3, -4, -6, -7, -8, -9, -9,-10,
		-10,-10,-10,-10,-10,-10,-11,-11,-12,-13,-15,-16,-18,-20,-22,-24,
		-25,-26,-27,-27,-27,-27,-27,-28,-28,-29,-31,-33,-37,-42,-47,-54,
		-61,-68,-76,-82,-88,-93,-96,-97,-95,-91,-84,-75,-63,-49,-34,-17,
	];
	//г
	[#.code int8*128] WAVE1 =
	[
		  0, 10, 20, 30, 39, 48, 56, 64, 71, 77, 81, 85, 88, 90, 91, 91,
		 90, 88, 85, 81, 77, 72, 67, 62, 56, 50, 44, 38, 33, 28, 23, 18,
		 14, 11,  8,  6,  4,  3,  3,  3,  3,  4,  5,  6,  8, 10, 12, 13,
		 15, 16, 18, 19, 19, 19, 19, 19, 18, 17, 15, 13, 11,  8,  5,  2,
		  0, -2, -5, -8,-11,-13,-15,-17,-18,-19,-19,-19,-19,-19,-18,-16,
		-15,-13,-12,-10, -8, -6, -5, -4, -3, -3, -3, -3, -4, -6, -8,-11,
		-14,-18,-23,-28,-33,-38,-44,-50,-56,-62,-67,-72,-77,-81,-85,-88,
		-90,-91,-91,-90,-88,-85,-81,-77,-71,-64,-56,-48,-39,-30,-20,-10,
	];
	//
	[#.code int8*128] WAVE2 =
	[
		 46, 38,-15, 15, 40,-45,104,121,-82, 98, -4, 20,-87,-61, 31, 35,
 		28,  8, 73,-16,-82,-20, 41, 44, 17, 75, 60, 92,125,  7,-22, 91,
		 62,-86,-61,-17, 30,-65,-36,-68,104,-30, 24,-66,-12,-11,-52,-98,
		-46, 36,  3, 30,-57,  5,-15,-62,124, 68,125, 92, 22,-116,123, 39,
		 -8, 33, 85,127,-128,-81,-124,-36,-85, 12,  8, 75, 84,-21,-72,-100,
		 -1, 29, 10,-40,-124, 75, 19,-71, 56,-127,-13, 90,-63, -1, 38, 92,
		-25,112, 69, 82, 32,-52,-98,-94, 32,-90,-14, 59,124, 38,-19, 17,
		 12, 97,-36,120,  1, 34, 34, 45,-114, 28,-57,127, 60,-86,-101, 44,
	];
	//Ҳ
	[#.code int8*128] WAVE3 =
	[
		0, 5, 11, 17, 23, 28, 34, 39, 45, 50, 55, 60, 65, 69, 74, 78,
		82, 85, 89, 92, 95, 98, 100, 102, 104, 106, 107, 109, 109, 110, 110, 111,
		110, 110, 109, 108, 107, 106, 104, 102, 100, 98, 95, 93, 90, 87, 83, 80,
		76, 72, 68, 64, 59, 55, 50, 46, 41, 36, 31, 26, 21, 15, 10, 5,
		0, -5, -10, -15, -21, -26, -31, -36, -41, -46, -50, -55, -59, -64, -68, -72,
		-76, -80, -83, -87, -90, -93, -95, -98, -100, -102, -104, -106, -107, -108, -109, -110,
		-110, -111, -110, -110, -109, -109, -107, -106, -104, -102, -100, -98, -95, -92, -89, -85,
		-82, -78, -74, -69, -65, -60, -55, -50, -45, -39, -34, -28, -23, -17, -11, -5,
	];
	//ǲ
	[#.code int8*128] WAVE4 =
	[
		-127,-123,-119,-115,-111,-107,-103,-99,-95,-91,-87,-83,-79,-75,-71,-67,
		-63,-59,-55,-51,-47,-43,-39,-35,-31,-27,-23,-19,-15,-11, -7, -3,
		  1,  5,  9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61,
		 65, 69, 73, 77, 81, 85, 89, 93, 97,101,105,109,113,117,121,125,
		127,123,119,115,111,107,103, 99, 95, 91, 87, 83, 79, 75, 71, 67,
		 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23, 19, 15, 11,  7,  3,
		 -1, -5, -9,-13,-17,-21,-25,-29,-33,-37,-41,-45,-49,-53,-57,-61,
		-65,-69,-73,-77,-81,-85,-89,-93,-97,-101,-105,-109,-113,-117,-121,-125,
	];
	//1
	[#.code int8*128] WAVE5 =
	[
		20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
		100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
		-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,-50,
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
		-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,
		-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,
	];
	//2
	[#.code int8*128] WAVE6 =
	[
		82, 85, 89, 92, 95, 98, 100, 102, 104, 106, 107, 109, 109, 110, 110, 111,
		0, 5, 11, 17, 23, 28, 34, 39, 45, 50, 55, 60, 65, 69, 74, 78,
		76, 72, 68, 64, 59, 55, 50, 46, 41, 36, 31, 26, 21, 15, 10, 5,
		110, 110, 109, 108, 107, 106, 104, 102, 100, 98, 95, 93, 90, 87, 83, 80,
		-76, -80, -83, -87, -90, -93, -95, -98, -100, -102, -104, -106, -107, -108, -109, -110,
		0, -5, -10, -15, -21, -26, -31, -36, -41, -46, -50, -55, -59, -64, -68, -72,
		-82, -78, -74, -69, -65, -60, -55, -50, -45, -39, -34, -28, -23, -17, -11, -5,
		-110, -111, -110, -110, -109, -109, -107, -106, -104, -102, -100, -98, -95, -92, -89, -85,
	];
}




