
unit SEG7X4A
{
	public const uint16 ID = 0;
	
	public link unit DATA {}
	public link unit SHIFT {}
	public link unit LOCK {}
	public link unit A {}
	public link unit B {}
	public link unit OE {}
	
	link bit DATA_IN = DATA.D0_IN;
	link bit DATA_OUT = DATA.D0_OUT;
	link bit DATA_DIR = DATA.D0_DIR;
	
	link bit LOCK_IN = LOCK.D0_IN;
	link bit LOCK_OUT = LOCK.D0_OUT;
	link bit LOCK_DIR = LOCK.D0_DIR;
	
	link bit SHIFT_IN = SHIFT.D0_IN;
	link bit SHIFT_OUT = SHIFT.D0_OUT;
	link bit SHIFT_DIR = SHIFT.D0_DIR;
	
	link bit A_IN = A.D0_IN;
	link bit A_OUT = A.D0_OUT;
	link bit A_DIR = A.D0_DIR;
	
	link bit B_IN = B.D0_IN;
	link bit B_OUT = B.D0_OUT;
	link bit B_DIR = B.D0_DIR;
	
	link bit OE_IN = OE.D0_IN;
	link bit OE_OUT = OE.D0_OUT;
	link bit OE_DIR = OE.D0_DIR;
	
	//[i] interface_map map;
	public unit map
	{
		link int8 AreaNumber;
		link int16 LineNumber;
		link uint8 BackData;
		link uint8 ClearData;
		link void Clear() {}
		link void set_pos( int16 Line, int16 area ) {}
		link void set_uint8( uint8 d ) {}
		link uint16 get_uint8() {}
		public const int8 TYPE = 1;
	}
	map.AreaNumber = AreaNumber;
	map.LineNumber = LineNumber;
	map.BackData = BackData;
	map.ClearData = ClearData;
	map.set_pos = set_pos;
	map.set_uint8 = set_uint8;
	map.get_uint8 = get_uint8;
	map.Clear = clear;
	
	//[i] var_uint8 OS_time;
	public uint8 OS_time;
	
	//ĸʾԪСλ
	[uint8*64] data;
	[uint8*64] data_show;
	bool is_changed;
	
	uint8 select;
	
	//---------------------------------------------------
	//[i] function_void OS_init;
	public void OS_init()
	{
		RunInit();
		
		is_changed = false;
		
		BackData = 0x00;
		ClearData = 0x00;
		
		clear();
		OS_time = 3;
	}
	//---------------------------------------------------
	//[i] function_void OS_run;
	
	//...
	
	//---------------------------------------------------
	//[i] function_void OS_thread;
	public void OS_thread()
	{
		if( is_changed ) {
			is_changed = false;
			DataChanged();
		}
	}
	//---------------------------------------------------
	//[i] function_void clear;
	public void clear()
	{
		for( uint8 i = 0; i < 64; i + 1 ) {
			data[i] = 0x00;
		}
		
		is_changed = true;
	}
	//---------------------------------------------------
	//[i] function_void open int32 int32;
	public void open( int32 l, int32 c )
	{
		int8 ll = (int8)(int16)l - 1;
		int8 cc = (int8)(int16)c - 1;
		if( ll < 0 || ll > 31 || cc < 0 || cc > 15 ) return;
		
		cc + (ll / 8 * 16 );
		ll % 8;
		
		data[cc] = data[cc] | (0x01 << (uint)ll);
		is_changed = true;
	}
	//---------------------------------------------------
	//[i] function_void close int32 int32;
	public void close( int32 l, int32 c )
	{
		int8 ll = (int8)(int16)l - 1;
		int8 cc = (int8)(int16)c - 1;
		if( ll < 0 || ll > 31 || cc < 0 || cc > 15 ) return;
		
		cc + (ll / 8 * 16 );
		ll % 8;
		
		data[cc] = data[cc] & ~(0x01 << (uint)ll);
		is_changed = true;
	}
	//---------------------------------------------------
	//[i] function_void swap int32 int32;
	public void swap( int32 l, int32 c )
	{
		int8 ll = (int8)(int16)l - 1;
		int8 cc = (int8)(int16)c - 1;
		if( ll < 0 || ll > 31 || cc < 0 || cc > 15 ) return;
		
		cc + (ll / 8 * 16 );
		ll % 8;
		
		data[cc] = data[cc] ^ (0x01 << (uint)ll);
		is_changed = true;
	}
	//---------------------------------------------------
	//[i] function_bool is_open int32 int32;
	public bool is_open( int32 l, int32 c )
	{
		int8 ll = (int8)(int16)l - 1;
		int8 cc = (int8)(int16)c - 1;
		if( ll < 0 || ll > 31 || cc < 0 || cc > 15 ) return false;
		return data[cc] & (0x01 << (uint)ll) != 0;
	}
	
	//[i] var_int8 AreaNumber;
	public const int8 AreaNumber = 4;
	//[i] var_int16 LineNumber;
	public const int16 LineNumber = 16;
	//[i] var_uint8 BackData;
	public uint8 BackData;
	//[i] var_uint8 ClearData;
	public uint8 ClearData;
	
	int16 Line;
	int16 area;
	
	//---------------------------------------------------
	//[i] function_void set_pos int16 int16;
	void set_pos( int16 l, int16 a )
	{
		Line = l;
		area = a;
	}
	//---------------------------------------------------
	//[i] function_void set_uint8 uint8;
	void set_uint8( uint8 d )
	{
		if( area >= 0 && area < AreaNumber && Line >= 0 && Line < LineNumber ) {
			data[area*LineNumber + Line] = d;
			is_changed = true;
		}
		Line + 1;
	}
	
	//---------------------------------------------------
	//[i] function_uint8 get_uint8;
	uint16 get_uint8()
	{
		if( area < 0 || area >= AreaNumber || Line < 0 || Line >= LineNumber ) return BackData;
		return data[area*LineNumber + Line];
	}
	
	#include "$run$.txt"
}


