/*************************************************************************
*
*************************************************************************/

char	*Sc55dispFuncTbl[8] =
{
	"exSC55_msgSet"      , 
	"exSC55_dotSet"      , 
	"SC55_initDotBuffer" , 
	"SC55_setDotBuffer"  , 
	"exSC55_dotBuffer"   , 

	NULL
};

int		SC55disp_macroInit( char *sqr )
{
	int			i;

	for ( i = 0; Sc55dispFuncTbl[i] != NULL; ++i )
		MMac_extDefine( sqr, Sc55dispFuncTbl[i], Sc55dispFuncTbl[i], MMAC_ATT_EXT, NULL );
	MMac_extDefine( sqr, "_SC55DISP_MACRO_DEFINED", "", MMAC_ATT_NORMAL , NULL );
	return (NORMAL);
}

int		_isSC55dot(int ch)
{
	ch &= 0xFF;
	if ( ch == '0' || ch == ' ' )
		return (0);
	else
		return (1);
}

/*************************************************************************
*	SC-55 液晶ディスプレイに文字を表示する
*-------------------------------------------------------------------------
*	$exSC55_msgSet("メッセージ")
*************************************************************************/

int		exSC55_msgSet( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		len, siz;
	char	*msg;

	if ( argc < 1 )
	{
_ERR:	MM_setErrMsg(sqr,"[SC-55] displayed letter error!");
		return(ERR);
	}
	msg = argv[0];
	len = strlen(msg);
	if ( len < 1 || len > 32 )
		goto _ERR;
	return sc55_genMML( sqr, bufSiz, buf, 0x100000, len, msg );
}


/*************************************************************************
*	SC-55 液晶ディスプレイにドット表示
*-------------------------------------------------------------------------
*	$exSC55_dotSet( l0, l1, l2, .. l15);
*************************************************************************/

int		exSC55_dotSet( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int				i, level;
	char			*s, dat[128];
	unsigned char	dot[256];

	if ( argc < 16 )
	{
_ERR:	MM_setErrMsg(sqr,"[SC-55] displayed dot data error!");
		return(ERR);
	}

	for ( level = 0; level < 16; ++level )
	{
		s = argv[level];
		while ( isspace(*s) )
			++s;
		if ( strlen(s) < 16 )
			goto _ERR;

		for ( i = 0; i < 16; ++i )
		{
			dot[(level*16)+i] = _isSC55dot(*s);
			++s;
		}
	}

	for ( i = 0; i < 16; ++i )
	{
		dat[i   ] = (dot[i*16+ 0]<<4) + (dot[i*16+ 1]<<3) + (dot[i*16+ 2]<<2) + (dot[i*16+ 3]<<1) + (dot[i*16+ 4]);
		dat[i+16] = (dot[i*16+ 5]<<4) + (dot[i*16+ 6]<<3) + (dot[i*16+ 7]<<2) + (dot[i*16+ 8]<<1) + (dot[i*16+ 9]);
		dat[i+32] = (dot[i*16+10]<<4) + (dot[i*16+11]<<3) + (dot[i*16+12]<<2) + (dot[i*16+13]<<1) + (dot[i*16+14]);
		dat[i+48] = (dot[i*16+15]<<4);
	}
	return sc55_genMML( sqr, bufSiz, buf, 0x100100, 64, dat );
}

int					Sc55dotBufXs = 0;
int					Sc55dotBufYs = 0;
unsigned char	   *Sc55dotBuffer = NULL;

/*************************************************************************
*	指定の大きさのドットバッファを用意する
*-------------------------------------------------------------------------
*	$SC55_initDotBuffer(x,y)
*************************************************************************/

int		SC55_initDotBuffer( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		x, y;

	if ( argc < 2 )
	{
_ERR:	MM_setErrMsg(sqr,"\x22SC55_initDotBuffer()\x22 parameter error!");
		return(ERR);
	}
	x = atoi(argv[0]);
	y = atoi(argv[1]);
	if ( x < 16 || y < 16 )
		goto _ERR;
	Sc55dotBufXs = x;
	Sc55dotBufYs = y;
	if ( (Sc55dotBuffer = calloc(Sc55dotBufXs*Sc55dotBufYs,1)) == NULL )
		goto _ERR;
	return (0);
}

/*************************************************************************
*	ドットバッファの指定位置にドットデータを設定する
*-------------------------------------------------------------------------
*	$SC55_setDotBuffer(line,"dat")
*************************************************************************/

int		SC55_setDotBuffer( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		x, y;
	char	*s;

	if ( Sc55dotBuffer == NULL || Sc55dotBufXs < 16 || Sc55dotBufYs < 16 )
	{
		MM_setErrMsg(sqr,"SC-55 dot buffer not initiarize!");
		return(ERR);
	}
	if ( argc < 2 )
	{
_ERR:	MM_setErrMsg(sqr,"\x22SC55_setDotBuffer()\x22 parameter error!");
		return(ERR);
	}
	y = atoi(argv[0]);
	s = argv[1];
	while ( isspace(*s) )
		++s;
	if ( *s )
	{
		for ( x = 0; x < Sc55dotBufXs; ++x )
		{
			Sc55dotBuffer[y * Sc55dotBufXs + x] = _isSC55dot(*s);
			++s;
			if ( *s == '\0' )
				break;
		}
	}
	return (0);
}


/*************************************************************************
*	ドットバッファ中の指定位置から16×16ドット分を表示
*-------------------------------------------------------------------------
*	$exSC55_dotBuffer(x,y)
*************************************************************************/

int		exSC55_dotBuffer( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int				y, x0, y0;
	char			*s, dat[128];
	unsigned char	dot[256];

	if ( Sc55dotBuffer == NULL || Sc55dotBufXs < 16 || Sc55dotBufYs < 16 )
	{
		MM_setErrMsg(sqr,"SC-55 dot buffer not initiarize!");
		return(ERR);
	}
	if ( argc < 2 )
	{
_ERR:	MM_setErrMsg(sqr,"\x22exSC55_dotBuffer()\x22 parameter error!");
		return(ERR);
	}
	x0 = atoi(argv[0]);
	y0 = atoi(argv[1]);
	if ( x0 < 0 || x0 + 15 > Sc55dotBufXs || y0 < 0 || y0 + 15 > Sc55dotBufYs )
		goto _ERR;

	for ( y = 0; y < 16; ++y, ++y0 )
	{
		dat[y   ] = (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 0]<<4)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 1]<<3)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 2]<<2)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 3]<<1)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 4]);
		dat[y+16] = (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 5]<<4)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 6]<<3)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 7]<<2)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 8]<<1)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+ 9]);
		dat[y+32] = (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+10]<<4)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+11]<<3)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+12]<<2)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+13]<<1)
		          + (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+14]);
		dat[y+48] = (Sc55dotBuffer[(y0*Sc55dotBufXs)+x0+15]<<4);
	}
	return sc55_genMML( sqr, bufSiz, buf, 0x100100, 64, dat );
}
