
//Ԫ
//ʼ:
//ָʱ 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 TXD {}
	public link unit RXD {}
	
	PORT.D2_DIR = RXD.D0_DIR;
	PORT.D2_OUT = RXD.D0_OUT;
	PORT.D3_DIR = TXD.D0_DIR;
	PORT.D3_OUT = TXD.D0_OUT;
	unit PORT
	{
		public link bit D2_DIR;
		public link bit D2_OUT;
		
		public link bit D3_DIR;
		public link bit D3_OUT;
	}
	
	link bit RX_DIR = RXD.D0_DIR;
	link bit RX_OUT = RXD.D0_OUT;
	
	link bit TX_DIR = TXD.D0_DIR;
	link bit TX_OUT = TXD.D0_OUT;
	link bit TX_IN = TXD.D0_IN;
	
	uint16 BitTick;
	uint16 BitTick_D32;
	uint16 BitTick_C;
	//---------------------------------------------------
	//ģʼ
	//[i] function_void OS_init;
	void OS_init()
	{
		RX_DIR = 1;
		RX_OUT = 1;
		
		//TX_DIR = 0;
		//TX_OUT = 1;
		
		set_baud( 9600 );
	}
	
	//---------------------------------------------------
	//ò
	public void set_baud( int32 b )
	{
		BitTick = (uint)(int16)(16000000 / b / 24);
		BitTick_C = BitTick - 3;
		BitTick_D32 = BitTick * 3 / 2;
	}
	//---------------------------------------------------
	//[i] function_void print_string Cstring;
	//һַ
	public void print_string( [int8*?] s )
	{
		uint16 i = 0;
		while( s[i] != 0 ) {
			i + 1;
		}
		uint8 CSUM = 0x00;
		print_char( 0xFD ); CSUM ^ 0xFD;
		print_char( 0x00 ); CSUM ^ 0x00;
		print_char( (int)i + 3 ); CSUM ^ (i.0(uint8)+3);
		print_char( 0x01 ); CSUM ^ 0x01;
		print_char( 0x00 ); CSUM ^ 0x00;
		
//		print_char( 0xD3 );
//		print_char( 0xEE );
//		print_char( 0xD2 );
//		print_char( 0xF4 );
//		print_char( 0xCC );
//		print_char( 0xEC );
//		print_char( 0xCF );
//		print_char( 0xC2 );
		
		i = 0;
		while( s[i] != 0 ) {
			print_char( s[i] );
			CSUM ^ (uint)s[i];
			i + 1;
		}
		uint32 d = CSUM;
		print_char( (int)d );
	}
	//---------------------------------------------------
	//һ
	///[i] function_void print_number int32;
	[int8*11] number_buffer;
	public void print_number( int32 data0 )
	{
		//
		bool isNeg;
		uint32 data;
		if( data0 >= 0 ) {
			data = (uint)data0;
			isNeg = false;
		} else {
			data = (uint)-data0;
			isNeg = true;
		}
		//ֵ
		int16 i = 0;
		forever {
			int8 ch = '0' + (int)(uint8)(uint16)(data % 10);
			number_buffer[i] = ch;
			i + 1;
			data / 10;
			if( data == 0 ) {
				if( isNeg ) {
					number_buffer[i] = '-';
					i + 1;
				}
				break;
			}
		}
		do {
			i - 1;
			print_char( number_buffer[i] );
		}
		while( i != 0 );
	}
	
	#include "$run$.txt"
}







