
unit char
{
	public const uint16 ID = 0;
	
	//[i] linkinterface_map map;
	public link unit map {}

	public struct icon
	{
		uint8 Type;
		int8 CharWidth;
		uint8 ColumnL;
		uint8 ColumnH;
		uint8 area;
		uint8 d0;
		uint8 d1;
		uint8 d2;
		uint8 d3;
		
		[uint8*?] buffer;
	}
	->struct icon EnglishFont;
	->struct icon ChineseFont;
	
	//---------------------------------------------------
	//ṩĽӿ
	//[i] interface_char char;
	unit char
	{
		link void clear() {}
		link void clear_line( int32 l ) {}
		link void write_char( int32 l, int32 c, int32 ch ) {}
		public int8 PerWidth;
	}
	char.clear = clear;
	char.clear_line = clear_line;
	char.write_char = print_line;
	
	//---------------------------------------------------
	//ʼ
	//[i] function_void OS_init;
	public void OS_init()
	{
		SetEnglishFontDefault();
	}
	//---------------------------------------------------
	//
	//[i] function_void clear;
	public void clear()
	{
		int8 i = 0;
		loop( 64 ) {
			//map.TBuffer[i] = 0;
			i + 1;
		}
	}
	//---------------------------------------------------
	//յ n 
	//[i] function_void clear_line int32;
	public void clear_line( int32 line )
	{
		
	}
	//---------------------------------------------------
	// n ʾ
	//[i] function_void print_line int32 int32 int32;
	public void print_line( int32 YY, int32 XX, int32 c )
	{
		if( c < ' ' ) {
			c + '0';
		}
		c - ' ';
		
		YY = YY / 8;
		int16 X = (int16)XX;
		int16 Y = (int16)YY;
		//int16 AreaX;
		//uint8 OffsetX;
		//SawToothMod16( X, AreaX, OffsetX );
		
		//uint16 XBlockNumber = 10;
		
		uint16 BufferIndex = 0;
		uint8 t = EnglishFont.Type;
		if( t == 129 && c <= 127 ) {
			uint8 cc = (uint8)(uint16)(uint)c;
			uint8 length = EnglishFont.buffer[0];
			BufferIndex = (length + 1);
			for( uint8 i = 0; i < length; i + 1 ) {
				if( EnglishFont.buffer[1 + i] == cc + ' ' ) {
					c = (int)i;
					break;
				}
			}
		}
		if( c > 127 ) {
			char.PerWidth = ChineseFont.CharWidth;
			
			uint16 cc = (uint16)(uint)c;
			uint8 length = ChineseFont.buffer[0];
			for( uint8 i = 0; i < length; i + 2 ) {
				uint16 gb2312 = 0;
				gb2312.0(uint8) = ChineseFont.buffer[1 + i];
				gb2312.8(uint8) = ChineseFont.buffer[2 + i];
				
				if( gb2312 == cc + ' ' ) {
					c = (int)i/2;
					break;
				}
			}
			BufferIndex = (length + 1);
			BufferIndex + ((uint16)(uint)c * (uint)char.PerWidth);
			uint16 ColumnC = ChineseFont.ColumnH * 256 + ChineseFont.ColumnL;
			uint8 lineNC = ChineseFont.area;
			
			//бͼ
			for( uint8 j = 0; j < lineNC; j + 8 ) {
				map.set_pos( X, Y + (int)j/8 );
				for( uint8 i = 0; i < (uint)char.PerWidth; i + 1 ) {
					uint8 d = ChineseFont.buffer[BufferIndex + i];
					map.set_uint8( d );
				}
				BufferIndex + ColumnC;
			}
		}
		else {
			char.PerWidth = EnglishFont.CharWidth;
			
			BufferIndex + ((uint16)(uint)c * (uint)char.PerWidth);
			uint16 ColumnE = EnglishFont.ColumnH * 256 + EnglishFont.ColumnL;
			uint8 lineNE = EnglishFont.area;
			
			//бͼ
			for( uint8 j = 0; j < lineNE; j + 8 ) {
				map.set_pos( X, Y + (int)j/8 );
				for( uint8 i = 0; i < (uint)char.PerWidth; i + 1 ) {
					uint8 d = EnglishFont.buffer[BufferIndex + i];
					map.set_uint8( d );
				}
				BufferIndex + ColumnE;
			}
		}
	}
	//---------------------------------------------------
	//[i] function_void SetEnglishFont font;
	public void SetEnglishFont( struct icon icon )
	{
		EnglishFont -> icon;
		char.PerWidth = EnglishFont.CharWidth;
	}
	//---------------------------------------------------
	//[i] function_void SetChinesFont font;
	public void SetChinesFont( struct icon icon )
	{
		ChineseFont -> icon;
		//char.PerWidth = ChineseFont.CharWidth;
	}
	//---------------------------------------------------
	//[i] function_void SetEnglishFontDefault;
	public void SetEnglishFontDefault()
	{
		EnglishFont -> font;
		char.PerWidth = EnglishFont.CharWidth;
	}
	//---------------------------------------------------
	//ȡģ, һ8ľݳ;(óȡ)
	void SawToothMod16( int16 n, #.base int16 Area, #.base uint8 Offset )
	{
		if( n > 0 ) {
			Area = n / 16;
			Offset = (uint)(int8)(n % 16);
		}
		else {
			Area = n / 16 - 1;
			Offset = 16 - (uint)(int8)(-n % 16);
		}
	}
[#.code uint8*?] font =
[
128,6,58,2,8,0,0,0,0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x00,0x24,0xF4,0x2F,0xF4,0x2F,0x24,0xC6,0x89,0xFF,0x91,0x63,0x00,0x70,0x8E,0xB9,0x4E,0xB8,0x80,0x02,0xC5,0x32,0x4C,0xA3,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x81,0x00,0x00,0x00,0x81,0x7E,0x00,0x00,0x24,0x18,0x7E,0x18,0x24,0x00,0x08,0x08,0x7F,0x08,0x08,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x80,0x60,0x18,0x06,0x01,0x00,0x7E,0x81,0x81,0x81,0x7E,0x00,0x00,0x82,0xFF,0x80,0x00,0x00,0xC6,0xA1,0x91,0x89,0x86,0x00,0x42,0x81,0x89,0x89,0x76,0x00,0x30,0x2C,0x22,0xFF,0x20,0x00,0x4F,0x89,0x89,0x89,0x71,0x00,0x7E,0x89,0x89,0x89,0x70,0x00,0x03,0x01,0xF9,0x07,0x01,0x00,0x76,0x89,0x89,0x89,0x76,0x00,0x0E,0x91,0x91,0x91,0x7E,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x80,0xC8,0x00,0x00,0x00,0x00,0x08,0x14,0x22,0x41,0x00,0x24,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x41,0x22,0x14,0x08,0x06,0x01,0xB1,0x09,0x06,0x00,0x7E,0x81,0xB9,0xA5,0xBE,0x00,0xFC,0x22,0x21,0x22,0xFC,0x00,0x81,0xFF,0x89,0x89,0x76,0x00,0x7E,0x81,0x81,0x81,0x43,0x00,0x81,0xFF,0x81,0x81,0x7E,0x00,0x81,0xFF,0x89,0x9D,0xC3,0x00,0x81,0xFF,0x89,0x1D,0x03,0x00,0x3C,0x42,0x81,0x91,0x73,0x00,0xFF,0x08,0x08,0x08,0xFF,0x00,0x00,0x81,0xFF,0x81,0x00,0x00,0xC1,0x81,0xFF,0x01,0x01,0x00,0x81,0xFF,0x89,0x34,0xC3,0x00,0x81,0xFF,0x81,0x80,0xC0,0x00,0xFF,0x0F,0xF0,0x0F,0xFF,0x00,0xFF,0x07,0x1C,0x70,0xFF,0x00,0x7E,0x81,0x81,0x81,0x7E,0x00,0x81,0xFF,0x89,0x09,0x06,0x00,0x7E,0x81,0xB1,0xC1,0x7E,0x00,0xFF,0x11,0x11,0x71,0xCE,0x00,0xC6,0x89,0x89,0x91,0x63,0x00,0x03,0x81,0xFF,0x81,0x03,0x00,0x7F,0x80,0x80,0x80,0x7F,0x00,0x07,0x38,0xE0,0x38,0x07,0x00,0x07,0xF8,0x0F,0xF8,0x07,0x00,0x81,0xE7,0x18,0xE7,0x81,0x00,0x01,0x87,0xF8,0x87,0x01,0x00,0x83,0xE1,0x99,0x87,0xC1,0x00,0x00,0xFF,0x81,0x81,0x00,0x00,0x01,0x06,0x18,0x60,0x80,0x00,0x00,0x81,0x81,0xFF,0x00,0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x40,0xA8,0xA8,0xF8,0x80,0x00,0x01,0xFF,0x88,0x88,0x70,0x00,0x70,0x88,0x88,0x98,0x00,0x00,0x70,0x88,0x89,0xFF,0x80,0x00,0x70,0xA8,0xA8,0xA8,0xB0,0x00,0x08,0xFE,0x09,0x09,0x00,0x00,0x10,0xA8,0xA8,0xA8,0xF8,0x00,0x81,0xFF,0x88,0x08,0xF0,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x00,0xC0,0x88,0xF9,0x00,0x00,0x81,0xFF,0x20,0x50,0x88,0x00,0x00,0x01,0xFF,0x80,0x80,0x00,0xF8,0x08,0xF8,0x08,0xF0,0x00,0x08,0xF8,0x08,0x08,0xF0,0x00,0x70,0x88,0x88,0x70,0x00,0x00,0xFC,0x24,0x24,0x38,0x00,0x00,0x38,0x24,0x24,0xFC,0x00,0x00,0x88,0xF8,0x90,0x08,0x08,0x00,0x00,0x98,0xA8,0xA8,0xC8,0x00,0x00,0x08,0x7E,0x88,0x80,0x00,0x78,0x80,0x88,0xF8,0x80,0x00,0x18,0x60,0x80,0x60,0x18,0x00,0x18,0xE0,0x38,0xE0,0x18,0x00,0x88,0xD8,0x20,0xD8,0x88,0x00,0x88,0xB8,0xC0,0x60,0x18,0x00,0x00,0x88,0xE8,0x98,0x88,0x00,0x00,0x18,0xE7,0x81,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x81,0xE7,0x18,0x00,0x00,0x08,0x04,0x04,0x08,0x04,0x00,
];
}



