
//[i] color english_UL,
LOAD ModuleLib system\language\english_UL.txt,

tone
[
	public link io []
	
	link MCU [] -> A MCU,
	
	//[i] var value1,
	N16 value1,
	//[i] var freq1,
	N16 freq1,
	//[i] var value2,
	N16 value2,
	//[i] var freq2,
	N16 freq2,
	
	N16 angle1,
	N16 angle2,
	
	//---------------------------------------------------
	//[i] function OS_init,
	V OS_init
	angle1 = 0,
	value1 = 0,
	freq1 = 1000,
	
	angle2 = 0,
	value2 = 0,
	freq2 = 1000,
	
	io SOUND_DIR = HIGH,
	io SOUND_OUT = LOW,
	timer_init,
	end.
	//---------------------------------------------------
	//ʱʼ
	// 11.0592MHz, ƵΪ1, ƵΪ 11059200Hz
	//ֵΪ 256
	//жƵΪ 11059200Hz / 256 = 43200Hz
	V timer_init
	//ģʽ
	MCU TCCR2 = 0B0110_1001,
	//ʼ
	MCU OCR2 = 0,
	//ж
	MCU TIFR | 0b0100_0000,
	//ʹж
	MCU TIMSK | 0b0100_0000,
	end.
	//---------------------------------------------------
	//жϷ
	
	link N8 OCR2 = MCU OCR2,
	N16 PWM,
	
	interrupt [MCU WATCH timer2_OVF]
	V tick
	
	//˫ͨƵ(Чʹ޷)
//	angle1 + freq1,
//	angle1 8(N8) = angle1 8(N8) & 0B0111_1111,
//	PWM = value1 * WAVE (angle1 8(N8)),
//	angle2 + freq2,
//	angle2 8(N8) = angle2 8(N8) & 0B0111_1111,
//	PWM + value2 * WAVE (angle2 8(N8)),
//	PWM >> 1,
//	MCU OCR2 = PWM 8(N8),
	
	//Ϊȼ۵ĻƵ,
	//С256˫ͨĲϳ
	
	//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,&WAVE%256"
	#asm "LDI r31,&WAVE/256"
	#asm "ADD r30,r26"
	#asm "ADC r31,r27"
	#asm "LPM r26,Z"
	#asm "LDS r27,&value1"
	#asm "MUL r26,r27"
	#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,&WAVE%256"
	#asm "LDI r31,&WAVE/256"
	#asm "ADD r30,r26"
	#asm "ADC r31,r27"
	#asm "LPM r26,Z"
	#asm "LDS r27,&value2"
	#asm "MUL r26,r27"
	
	#asm "LDD r30,y+&PWM"
	#asm "LDD r31,y+&PWM+1"
	
	#asm "ADD r30,r0"
	#asm "ADC r31,r1"
	#asm "ROR r31"
	#asm "OUT 0x23,r31"
	end.
	//---------------------------------------------------
	LINK VT CODE {} -> A Cloud code,
	[CODE N8*128] WAVE =
	[
		  0,  1,  1,  2,  3,  4,  6,  8, 10, 13, 15, 19, 22, 25, 29, 33,
		 38, 42, 47, 52, 57, 62, 68, 73, 79, 85, 91, 97,103,109,115,121,
		127,133,139,145,151,157,163,169,175,181,186,192,197,202,207,212,
		216,221,225,229,232,235,239,241,244,246,248,250,251,252,253,253,
		254,253,253,252,251,250,248,246,244,241,239,235,232,229,225,221,
		216,212,207,202,197,192,186,181,175,169,163,157,151,145,139,133,
		127,121,115,109,103, 97, 91, 85, 79, 73, 68, 62, 57, 52, 47, 42,
		 38, 33, 29, 25, 22, 19, 15, 13, 10,  8,  6,  4,  3,  2,  1,  1
	],
]









































