static ucg_int_t ucg_handle_ld50t6160_l90tc(ucg_t *ucg)
{
  if ( ucg_clip_l90tc(ucg) != 0 )
  {
    uint8_t buf[3];
    ucg_int_t dx, dy;
    ucg_int_t i;
    const uint8_t *seq;
    unsigned char pixmap;
    uint8_t bitcnt;
    ucg_com_SetCSLineStatus(ucg, 0);		/* enable chip */
    switch(ucg->arg.dir)
    {
      case 0: 
	dx = 1; dy = 0; 
	seq = ucg_ld50t6160_set_pos_dir0_seq;
	break;
      case 1: 
	dx = 0; dy = 1; 
	seq = ucg_ld50t6160_set_pos_dir1_seq;
	break;
      case 2: 
	dx = -1; dy = 0; 
	seq = ucg_ld50t6160_set_pos_dir2_seq;
	break;
      case 3: 
      default:
	dx = 0; dy = -1; 
	seq = ucg_ld50t6160_set_pos_dir3_seq;
	break;
    }
    pixmap = ucg_pgm_read(ucg->arg.bitmap);
    bitcnt = ucg->arg.pixel_skip;
    pixmap <<= bitcnt;
    buf[0] = ucg->arg.pixel.rgb.color[0]>>2;
    buf[1] = ucg->arg.pixel.rgb.color[1]>>2;
    buf[2] = ucg->arg.pixel.rgb.color[2]>>2;
    
    for( i = 0; i < ucg->arg.len; i++ )
    {
      if ( (pixmap & 128) != 0 )
      {
	ucg_com_SendCmdSeq(ucg, seq);	
	ucg_com_SendRepeat3Bytes(ucg, 1, buf);
      }
      pixmap<<=1;
      ucg->arg.pixel.pos.x+=dx;
      ucg->arg.pixel.pos.y+=dy;
      bitcnt++;
      if ( bitcnt >= 8 )
      {
	ucg->arg.bitmap++;
	pixmap = ucg_pgm_read(ucg->arg.bitmap);
	bitcnt = 0;
      }
    }
    ucg_com_SetCSLineStatus(ucg, 1);		/* disable chip */
    return 1;
  }
ucg_int_t ICACHE_FLASH_ATTR ucg_handle_ili9163_l90fx(ucg_t *ucg)
{
  uint8_t c[3];
  ucg_int_t tmp;
  if ( ucg_clip_l90fx(ucg) != 0 )
  {
    switch(ucg->arg.dir)
    {
      case 0: 
	ucg->arg.pixel.pos.y += 32;
	ucg_com_SendCmdSeq(ucg, ucg_ili9163_set_pos_dir0_seq);	
	ucg->arg.pixel.pos.y -= 32;
	break;
      case 1: 
	ucg->arg.pixel.pos.y += 32;
	ucg_com_SendCmdSeq(ucg, ucg_ili9163_set_pos_dir1_seq);	
	ucg->arg.pixel.pos.y -= 32;
	break;
      case 2: 
	tmp = ucg->arg.pixel.pos.x;
	ucg->arg.pixel.pos.x = 127-tmp;
	ucg->arg.pixel.pos.y += 32;
	ucg_com_SendCmdSeq(ucg, ucg_ili9163_set_pos_dir2_seq);	
	ucg->arg.pixel.pos.y -= 32;
	ucg->arg.pixel.pos.x = tmp;
	break;
      case 3: 
      default: 
	tmp = ucg->arg.pixel.pos.y;
	ucg->arg.pixel.pos.y = 127-tmp;
	//ucg->arg.pixel.pos.y += 32;
	ucg_com_SendCmdSeq(ucg, ucg_ili9163_set_pos_dir3_seq);	
	ucg->arg.pixel.pos.y = tmp;
	break;
    }
    c[0] = ucg->arg.pixel.rgb.color[0];
    c[1] = ucg->arg.pixel.rgb.color[1];
    c[2] = ucg->arg.pixel.rgb.color[2];
    ucg_com_SendRepeat3Bytes(ucg, ucg->arg.len, c);
    ucg_com_SetCSLineStatus(ucg, 1);		/* disable chip */
    return 1;
  }
  return 0;
}
static ucg_int_t ucg_handle_ld50t6160_l90fx(ucg_t *ucg)
{
  uint8_t c[3];
  //ucg_int_t tmp;
  if ( ucg_clip_l90fx(ucg) != 0 )
  {
    switch(ucg->arg.dir)
    {
      case 0: 
	ucg_com_SendCmdSeq(ucg, ucg_ld50t6160_set_pos_dir0_seq);	
	break;
      case 1: 
	ucg_com_SendCmdSeq(ucg, ucg_ld50t6160_set_pos_dir1_seq);	
	break;
      case 2: 
	//tmp = ucg->arg.pixel.pos.x;
	//ucg->arg.pixel.pos.x = 127-tmp;
	ucg_com_SendCmdSeq(ucg, ucg_ld50t6160_set_pos_dir2_seq);	
	//ucg->arg.pixel.pos.x = tmp;
	break;
      case 3: 
      default: 
	//tmp = ucg->arg.pixel.pos.y;
	//ucg->arg.pixel.pos.y = 159-tmp;
	ucg_com_SendCmdSeq(ucg, ucg_ld50t6160_set_pos_dir3_seq);	
	//ucg->arg.pixel.pos.y = tmp;
	break;
    }
    c[0] = ucg->arg.pixel.rgb.color[0]>>2;
    c[1] = ucg->arg.pixel.rgb.color[1]>>2;
    c[2] = ucg->arg.pixel.rgb.color[2]>>2;
    ucg_com_SendRepeat3Bytes(ucg, ucg->arg.len, c);
    ucg_com_SetCSLineStatus(ucg, 1);		/* disable chip */
    return 1;
  }
  return 0;
}