/*
	Ｇｐｅｎ共通関数
		別ヘッダ必要版
*/

void umosv( int x1, int y1, int x2, int y2 )
{
	mosv( x1*bi, y1*bi, (x2+1)*bi-1, (y2+1)*bi-1);
}

void biubox( int x1, int y1, int x2, int y2, int c1, int c2, int c3 )
{
	uboxf(x1*bi-1, y1*bi-1, (x2+1)*bi, (y2+1)*bi, c1, c2, c3 );
}

void biboxbf( int x1, int y1, int x2, int y2, int c, int h, int h2 )
{
	uboxf( x1*bi-h-1, y1*bi-h2-1, (x2+1)*bi+h, (y2+1)*bi+h, 15, 8, BCL );
	uboxf( x1*bi-1, y1*bi-1, (x2+1)*bi, (y2+1)*bi, 8, 15, c );
}

int gpx(int mx)
{
	int mx2;
	mx2 = BX1 + ( mx/bi - NX4/2 + ix/2 - BX1 ) / ix * ix;
	if ( mx2 < BX1 )	mx2 = BX1;
	if ( mx2 + NX3 > BX2 )	mx2 = BX2 - NX3;
	return (mx2);
}

int gpy(int my)
{
	int my2;
	my2 = BY1 + ( my/bi - NY4/2 + iy/2 - BY1 ) / iy * iy;
	if ( my2 < BY1 )	my2 = BY1;
	if ( my2 + NY3 > BY2 )	my2 = BY2 - NY3;
	return (my2);
}

void wget( void )
{
	egbget( NX1, NY1, NX2, NY2, wb );
}

void wput( void )
{
	egbput( NX1, NY1, NX2, NY2, wb );
	if (WX4!=NX4)
		egbputZ( WX1, WY1, WX2, WY2, NX4, NY4, wb );
}

void wkk( void )
{
	wget();
	if (WX4!=NX4)
		egbputZ( WX1, WY1, WX2, WY2, NX4, NY4, wb );
}

void wkugiri( int t )
{
	static int g=0;
	char a[1024];
	int i;
	if ( t == 2 )
		g = 0;
	if ( t == 3 )
		g = 1;
	if ( t & g )
	{
		line(WX1*bi, (WY1+KS)*bi, (WX2+1)*bi-1, (WY1+KS)*bi, 8 );
		for (i=1; i<NX4; i++)
		{
			line((WX1+KS*i)*bi, WY1*bi, (WX1+KS*i)*bi, (WY2+1)*bi-1, 8 );
			line((WX1+KS*i)*bi, (WY1+KS)*bi, (WX1+KS*i)*bi, (WY1+KS)*bi, 15 );
		}
		egbget( WX1*bi, (WY1+KS)*bi, (WX2+1)*bi-1, (WY1+KS)*bi, a );
		for (i=2; i<NY4; i++)
		{
			egbput(WX1*bi, (WY1+KS*i)*bi, (WX2+1)*bi-1, (WY1+KS*i)*bi, a);
		}
	}	else	{
		boxf( WX1*bi, WY1*bi, (WX2+1)*bi-1, (WY2+1)*bi-1, 0 );
	}
}

int page( int c )
{
	static int v = 0;
	char t[12];
	egbget( BX1,BY1, BX2,BY2, vp);
	v += c;
	while (v < 0)
		v += vz + 1;
	while ( v > vz )
		v -= vz + 1;
	vp = vp0 + v * BX4 * BY4 * Cb / 8;
	egbput( BX1,BY1, BX2,BY2, vp);
	wpg(0);
	boxf( PAX1+1, PAY1+1, PAX2-1, PAY2-1, 8 );
	_itoa( v+1, t, 10 );
	symbol( PAX2-4-strlen(t)*8, PAY2-1, t, 16, 15 );
	wpg(1);
	return (v);
}

void pbtn( int mb )
{
	int x, y, bt = 10;
	unsigned int t1, t2;
	t1 = MOS_getTime();
	while (mb)
	{
		page((mb & 1) ? 1 : (-1));
		do
		{
			t2 = MOS_getTime();
			MOS_rdpos(&mb,&x,&y);
		}	while (t2-t1<bt && mb!=0);
		t1 = t2;
		if (bt>1)
			bt--;
	}
}

void bfgs( int mc )
{
	char t[12];
	int p, x, y;
	p = EGB_getWritePage( 0, 0 );
	if (mc==1)
	{
		ix*=2;
		if (ix>=256/bi)
			ix = 1;
		iy*=2;
		if (iy>=256/bi)
			iy = 1;
	}	else	{
		if (ix==1)
			ix+=256/bi;
		if (iy==1)
			iy+=256/bi;
		ix/=2;
		iy/=2;
	}
	wpg(0);
	boxf( HX1+1, HY1+1, HX2-1, HY2-1, 0 );
	_itoa( ix, t, 10 );
	symbol( HX2-4-strlen(t)*8, HY2-1, t, 16, 15 );
	wpg(p);
	mbout( &p, &x, &y );
}

void mbclp( void )
{
	MOS_getBtnXchg( &bc );
	boxf( PCX1, PCY1, PCX2, PCY2, mcl[0] );
	boxf( PLX1, PLY1, PLX2, PLY2, mcl[1+bc] );
	boxf( PRX1, PRY1, PRX2, PRY2, mcl[2-bc] );
	wpg(0);
	boxf( PCX1*bi+2, PCY1*bi-5, PCX1*bi+12, PCY1*bi-3, (mcl[0]>>15)*0xff );
	boxf( PLX1*bi+2, PLY1*bi-5, PLX1*bi+12, PLY1*bi-3, (mcl[1+bc]>>15)*0xff );
	boxf( PRX1*bi+2, PRY1*bi-5, PRX1*bi+12, PRY1*bi-3, (mcl[2-bc]>>15)*0xff );
	wpg(1);
}

void bfgp( int mb, int mx, int my )		/*	バッファ編集窓間複写	*/
{
	int mx2, my2;
	mx2 = gpx(mx);
	my2 = gpy(my);
	if (mb == 1)
	{
		wget();
		egbput(mx2, my2, mx2+NX3, my2+NY3, wb );
	}	else	{
		egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
		wput();
	}
}

void tclc(int mb, int mx, int my)
{
	char t[4];
	egbget( mx/bi, my/bi, mx/bi, my/bi, t );
	mcl[mb] = WORD(t) & CF;
	mbclp();
}

void bcls(void)
{
	int i;
	for (i = 0; i<BY4; i+=2)
	{
		/*
		line(BX1,BY1+i,BX2,BY1+i,0);
		line(BX1,BY2-i,BX2,BY2-i,0);
		*/
		line(BX1,BY1+i,BX1+i,BY1,0);
		line(BX2,BY1+i,BX2-i,BY1,0);
		line(BX1,BY2-i,BX1+i,BY2,0);
		line(BX2,BY2-i,BX2-i,BY2,0);
	}
}

void wcls(void)
{
	int i;
	for (i = 0; i<NY4; i+=2)
	{
		line(NX1,NY1+i,NX2,NY1+i,0);
		line(NX1,NY2-i,NX2,NY2-i,0);
	}
	wkk();
}

void aqx(void)
{
	egbget(BX1,BY1,BX2,BY2,b);
	egbget(BX1+1,BY1,BX2+1,BY2,b+BX4*BY4*2);
	egbputZ(BX1,BY1,BX1+BX4/2-1,BY2,BX4,BY4,b);
	egbputZ(BX1+BX4/2,BY1,BX2,BY2,BX4,BY4,b+BX4*BY4*2);
}

void aqy(void)
{
	egbget(BX1,BY1,BX2,BY2,b);
	egbget(BX1,BY1+1,BX2,BY2+1,b+BX4*BY4*2);
	egbputZ(BX1,BY1,BX2,BY1+BY4/2-1,BX4,BY4,b);
	egbputZ(BX1,BY1+BY4/2,BX2,BY2,BX4,BY4,b+BX4*BY4*2);
}
