/*****************************************************************
		ＴＯＷＮＳマルチバッファパターンエディタ
			Ｇ-Ｐｅｎ３２ｋ		ver.1.063 フリコレ用
						Copyright(C) 1991-1994 Okome
*****************************************************************/

#include	<stdio.h>
#include	<io.h>
#include	<stdlib.h>
#include	<string.h>
#include	<math.h>
#include	<fmcfrb.h>
#include	<EGB.H>
#include	<MOS.H>
#include	<kkstr2.h>
#include	<normlib.h>
#include	<okome.h>
#define	MAIN
#include	<GPen32k.h>
#undef	MAIN
#include	<old.h>
/*	#include	<rpgpat.h>	*/

void endu(void)
{
	if(message2(1, "Ｇ-Ｐｅｎ３２ｋを終了します", 2)==0)
		end();
}

void draw()		/*	画面初期化	*/
{
	int i, x, y;
	char c[64] = {	0x00,0x00,	0x10,0x00,	0x00,0x02,	0x10,0x02,
					0x00,0x40,	0x10,0x40,	0x00,0x42,	0x10,0x42,
					0x08,0x21,	0x1f,0x00,	0xe0,0x03,	0xff,0x03,
					0x00,0x7c,	0x1f,0x7c,	0xe0,0x7f,	0xff,0x7f };
	char *tl[] = {"〜","／","□","■","○","●","楕○","楕●","↑↓","←→",
				"Poly","塗","Copy","Roll","ぼけ","回転","拡縮","反転",
				"mono","mono",
				"⇔","⇔重","〜","Roll","色々","もわ" };
	wpg(0);
	EGB_tmenuPalette2( work );
	MEN_sidein(2);		/*	メニューへのサイドワークの追加	*/
	MEN_set(2);
	font12( 592, 16, "大  終", 15 );
/*	font12( 615, 16, "終", 15 );	*/
	boxf( 0, 20, 639, 479, BCL );
	KAN_disp(KAN_DISPON);
	KAN_setMode(0x30140);
	wpg(1);
	EGB_displayStart( work, 2, bi, bi );
	EGB_displayStart( work, 3, 640/bi, 480/bi );
	egbputZ( CSX1, CSY1, CSX2, CSY2, 16, 1, c );
	colmix(1, 0);
	colmix(2, 1);
	wpg(0);
	biboxbf( WX1, WY1, WX2, WY2, 0, 8, 8 );
	biboxbf( BX1, BY1, BX2, BY2, 0, 8, 8 );
	biboxbf( NX1, NY1, NX2, NY2, 0, 4, 4 );
	biboxbf( CSX1, CSY1, CSX2, CSY2, 0, 2, 2 );
	biubox( CBLX1-1, CBY1-1, CBRX2+1, CBY2+1, 15, 8, BCL );
	biubox( CBX1, CBY1, CBX2, CBY2, 8, 15, 0 );
	biubox( CBLX1, CBLY1, CBLX2, CBLY2, 8, 15, 0 );
	biubox( CBRX1, CBRY1, CBRX2, CBRY2, 8, 15, 0 );
	ubox( CSBX1, CSBY1, CSBX2, CSBY2, 15, 8 );
	for ( i = 0; i < MEZ0; i++ ) {
		x = i % MEX2;
		y = i / MEX2;
		uboxf( MEX1+MEX4*x, MEY1+MEY4*y,
			  MEX1+MEX4*(x+1)-1, MEY1+MEY4*(y+1)-1, 15, 8, (i<MEZ1) ? 7 : 12 );
		symbol(MEX1+MEX4*x+MEX4/2-strlen(tl[i])*4,MEY1+MEY4*y+18,
			   tl[i], 16, 15 );
	}
	wkugiri(1);
	biubox( PALX-32/bi, PALY-28/bi, PALX+127+6/bi, PALY+PALB*3-1+4/bi,
			 15, 8, BCL );
	biubox( PALX, PALY, PALX+127, PALY+PALB*3-1, 8, 15, 0 );
	biboxbf( PCX1, PCY1, PCX2, PCY2, 0, 0, 0 );
	biboxbf( PLX1, PLY1, PLX2, PLY2, 0, 0, 0 );
	biboxbf( PRX1, PRY1, PRX2, PRY2, 0, 0, 0 );
	ubox( SPX1, SPY1, SPX2, SPY2, 15, 8 );
	ubox( RX1, RY1, RX2, RY2, 15, 8 );
	font12( SPX1+6, SPY2-4, "SPOIT", 15 );
	ubox( PAX1, PAY1, PAX2, PAY2, 8, 15 );
	ubox( HX1, HY1, HX2, HY2, 8, 15 );
	bfgs(1);
	svpp(VX1+128);
	wpg(1);
	hsrg(-1);
	mbclp();
	page(0);
}

void gmenu( int mx, int my )		/*	アイコンMENU	*/
{
	int x, y, i, j;
	
	i = (( mx - MEX1 ) / MEX4) + MEX2 * (( my - MEY1 ) / MEY4);
	j = ( i<MEZ1 ) ? 0 : 1 ;
	x = MEX1 +((mei[j] + j * MEZ1) % MEX2)* MEX4;
	y = MEY1 + (mei[j] + j * MEZ1) / MEX2 * MEY4;
	mei[j] = i - j * MEZ1;
	mx = MEX1 +(i % MEX2)* MEX4;
	my = MEY1 + i / MEX2 * MEY4;
	wpg(0);
	ubox(  x,  y,  x+MEX4-1,  y+MEY4-1, 15, 8 );
	ubox( mx, my, mx+MEX4-1, my+MEY4-1, 8, 15 );
	wpg(1);
}

void raten( int mb, int cx, int cy, int x1, int y1, int x2, int y2, 
									int sx1, int sy1, int sx2, int sy2 )
{
	char pa[64], pab[64];
	int n, ws, a, b2, mx, my, c, d;
	int x, y, x3, y3, x4, y4, x5, y5, x6, y6, x7=0, y7=0, x8, y8;
	double ls, xx, yy, ax, ay;
	view( WX1,WY1, WX2,WY2 );
	egbget(x1,y1,x2,y2, b);
	vput2(640/bi,0, 640/bi+x2-x1,y2-y1, b);
	EGB_writePage( work, 0 );
	EGB_writeMode( work, 4 );
	x3 = x1*bi;	y3 = y1*bi;
	x4 = x2*bi;	y4 = y1*bi;
	x5 = x2*bi;	y5 = y2*bi;
	x6 = x1*bi;	y6 = y2*bi;
	MOS_disp(0);
	connect(5, x3,y3, x4,y3, x4,y4, x3,y4, x3,y3, 0x02, 0x7fff );
	MOS_disp(1);
	cx /= bi;
	cy /= bi;
	mbout( &mb, &mx, &my );
	mbin( &mb, &x8, &y8 );
	do {
		MOS_rdpos( &mb, &x, &y );
		if (x7 != x || y7 != y) {
			MOS_disp(0);
			connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
			MOS_disp(1);
			ls = atan2(x8-cx*bi, y8-cy*bi) - atan2(x-cx*bi,y-cy*bi);
			xx = x1 - cx;
			ax = x2 - cx;
			yy = y1 - cy;
			ay = y2 - cy;
			x3 = (cx + xx * cos(ls) - yy * sin(ls))*bi;
			y3 = (cy + xx * sin(ls) + yy * cos(ls))*bi;
			x4 = (cx + ax * cos(ls) - yy * sin(ls))*bi;
			y4 = (cy + ax * sin(ls) + yy * cos(ls))*bi;
			x5 = (cx + ax * cos(ls) - ay * sin(ls))*bi;
			y5 = (cy + ax * sin(ls) + ay * cos(ls))*bi;
			x6 = (cx + xx * cos(ls) - ay * sin(ls))*bi;
			y6 = (cy + xx * sin(ls) + ay * cos(ls))*bi;
			MOS_disp(0);
			connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
			MOS_disp(1);
			x7 = x;
			y7 = y;
		}
	}	while (mb);
	MOS_disp(0);
	connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
	MOS_disp(1);
	EGB_writeMode( work, 0 );
	EGB_writePage( work, 1 );
	WORD(pa) = 4;
	WORD(pa+2) = sx1;
	WORD(pa+4) = sy1;
	WORD(pa+6) = sx2;
	WORD(pa+8) = sy1;
	WORD(pa+10) = sx2;
	WORD(pa+12) = sy2;
	WORD(pa+14) = sx1;
	WORD(pa+16) = sy2;
	EGB_region( work, &n, &ws, &a, &b2, &c, &d, pa );
	pab[0] = 1;
	pab[1] = 0;
	WORD(pab+2) = (cx-x1)/KS+sx1;
	WORD(pab+4) = (cy-y1)/KS+sy1;
	ls *= 180.0 / _PI;
	if (ls<0)
		ls+=360.0;
	if (ls>=360.0)
		ls-=360.0;
	WORD(pab+6) = (int)ls;
	EGB_rotate( work, 0, pab, b );
	wkk();
}

void ten(int x, int y, int h)
{
	int i;
	egbget(x,y,x+h-1,y+h-1, b);
	for ( i=0; i<h; i++ )
		vput2(x+i,y,x+i,y+h-1, &b[h*(h-i-1)*2]);
}

void rollsub( int x3, int y3, int X1, int Y1, int X3, int Y3 )
{
	int X2, Y2, Y4;
	X2 = X1+X3;
	Y2 = Y1+Y3;
	Y4 = Y3+1;
	egbget( X1, Y1, X1+(x3-1 & X3), Y2, b );
	egbget( X1+x3, Y1, X2, Y2, &(b[x3*Y4*2]) );
	vput2( X2-(x3-1 & X3), Y2-(y3-1 & Y3), X2, Y2, b );
	vput2( X2-(x3-1 & X3), Y1, X2, Y2-y3, &(b[x3*y3*2]) );
	vput2( X1, Y2-(y3-1 & Y3), X2-x3, Y2, &(b[x3*Y4*2]) );
	vput2( X1, Y1, X2-x3, Y2-y3, &(b[(x3*Y4+(X3-x3+1)*y3)*2]) );
}

void rollsander( int mb, int mx, int my )
{
	int x2, y2;
	mx = wnx(mx);
	my = wny(my);
	do {
		MOS_rdpos( &mb, &x2, &y2 );
		rollsub( mx - wnx(x2) & NX3, my - wny(y2) & NY3, NX1, NY1, NX3, NY3 );
		if (NX4!=WX4)
			wkk();
		mx = wnx(x2);
		my = wny(y2);
	}	while (mb);
}

void tometen(int x1, int y1, int x2, int y2)
{
	int x, y, mb;
	wpg(0);
	for (y = y1; y<=y2; y++) {
		EGB_writePage(work,1);
		egbget(x1,y,x2,y,b);
		EGB_writePage(work,0);
		for (x = x1; x<=x2; x++) {
			if ((WORD(b+(x-x1)*2) & 0x8000)!=0) {
				line(x*bi,y*bi,(x+1)*bi-1,(y+1)*bi-1,15);
				line((x+1)*bi-1,y*bi,x*bi,(y+1)*bi-1,8);
			}
		}
	}
	MOS_typeRom2( 76, 8, 8, mpat );
	wpg(1);
	mbin(&mb,&x,&y);
	mbout(&mb,&x,&y);
	wpg(0);
	boxf(x1*bi,y1*bi,(x2+1)*bi-1,(y2+1)*bi-1,0);
	MOS_typeRom2( 81, 1, 1, mpat );
	wpg(1);
}

void vtengh(void)
{
	int x, y, h, s, v;
	char *p;
	p = b;
	c32toHSV(mcl[0], &h,&s,&v);
	for (y=0; y<256; y+=2)
		for (x=0; x<256; x+=2) {
			WORD(p) = HSVto32k(h, y, x);
			p+=2;
		}
	vput2(BX1,BY1,BX2,BY2,b);
}

void vtengs(void)
{
	int x, y, h, s, v;
	char *p;
	p = b;
	c32toHSV(mcl[0], &h,&s,&v);
	for (y=0; y<256; y+=2)
		for (x=0; x<512*3; x+=12) {
			WORD(p) = HSVto32k(x, s, y);
			p+=2;
		}
	vput2(BX1,BY1,BX2,BY2,b);
}

void vtengv(void)
{
	int x, y, h, s, v;
	char *p;
	p = b;
	c32toHSV(mcl[0], &h,&s,&v);
	for (y=0; y<256; y+=2)
		for (x=0; x<512*3; x+=12) {
			WORD(p) = HSVto32k(x, y, v);
			p+=2;
		}
	vput2(BX1,BY1,BX2,BY2,b);
}

/*	編集窓用機能軍	*/

void mpaint( int mb, int mx, int my )
{
	char pa[4];
	EGB_paintMode( work, 0x22 );
	EGB_color( work, 2, mcl[mb] );
	WORD(pa) = wnx(mx);
	WORD(pa+2) = wny(my);
	EGB_closePaint( work, pa );
	wkk();
}

void mdr( int mb, int mx, int my )	/*	編集窓描画	*/
{
	int mx2, my2, x, y, x2, y2;
	mx2 = mx;
	my2 = my;
	while (mb != 0 && mx/bi >= WX1 && mx/bi <= WX2
				   && my/bi >= WY1 && my/bi <= WY2 )
	{
		EGB_writeMode( work, (vr==128) ? 0 : 7 );
		EGB_pastel( work, vr*2 );
		line( wnx(mx2), wny(my2), wnx(mx), wny(my), mcl[mb] );
		EGB_writeMode( work, 0 );
		EGB_pastel( work, 128 );
		x = wnx(mx);
		x2 = wnx(mx2);
		bsz( &x, &x2 );
		y = wny(my);
		y2 = wny(my2);
		bsz( &y, &y2 );
		egbget( x, y, x2, y2, b );
		egbputZ( WX1+(x-NX1)*KS, WY1+(y-NY1)*KS,
				 WX1+(x2-NX1+1)*KS-1, WY1+(y2-NY1+1)*KS-1,
				 x2-x+1, y2-y+1, b );
		mx2 = mx;
		my2 = my;
		MOS_rdpos( &mb, &mx, &my );
	}
}

void mwwp( int *mb, int *mx, int *my, int *x, int *y, void (*vfp)(), int f )
{
	int x2, y2, b2;
	view( WX1,WY1, WX2,WY2 );
	umosv( WX1,WY1, WX2,WY2 );
	EGB_writeMode( work, 4 );
	*mx = wcx(*mx);
	*my = wcy(*my);
	vfp( *mx, *my, *mx, *my, 0x7fff );
	x2 = *mx;
	y2 = *my;
	do {
		b2 = *mb;
		MOS_rdpos( mb, x, y );
		*x = wcx(*x);
		*y = wcy(*y);
		if (*x != x2 || *y != y2 ) {
			vfp( *mx, *my, x2, y2, 0x7fff );
			vfp( *mx, *my, *x, *y, 0x7fff );
		}
		x2 = *x;
		y2 = *y;
	}	while (*mb);
	if (f==0)
		vfp( *mx, *my, x2, y2, 0x7fff );
	*mb = b2;
}

void mline( int mb, int mx, int my, void (*vic)() )
{
	int x, y;
	mwwp( &mb, &mx, &my, &x, &y, vic, 0 );
	view( NX1,NY1, NX2,NY2 );
	EGB_writeMode( work, (vr==128) ? 0 : 7 );
	EGB_pastel( work, vr*2 );
	vic( nbx(mx), nby(my), nbx(x), nby(y), mcl[mb] );
	EGB_writeMode( work, 0 );
	EGB_pastel( work, 128 );
	wkk();
}

void mcpyl( int mb, int mx, int my, int c )
{
	int x, y, x2, y2, x3, y3;
	mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
	bsz( &mx, &x );
	bsz( &my, &y );
	egbget( nbx(mx),nby(my), nbx(x),nby(y), b );
	boxb( mx, my, x, y, 0x7fff );
	mbin( &mb, &x3, &y3 );
	if (mb == 1) {
		if (c) {
			EGB_writeMode( work, 0 );
			boxf(wnx(mx),wny(my), wnx(x), wny(y), mcl[2] );
			EGB_writeMode( work, 4 );
		}
		x3 = wcx(x3);
		y3 = wcy(y3);
		mx -= x3;
		my -= y3;
		x -= x3;
		y -= y3;
		do {
			MOS_rdpos( &mb, &x2, &y2 );
			x2 = wcx(x2);
			y2 = wcy(y2);
			while ( x2+x > WX2 )
				x2-=KS;
			while ( y2+y > WY2 )
				y2-=KS;
			while ( x2+mx < WX1 )
				x2+=KS;
			while ( y2+my < WY1 )
				y2+=KS;
			if (x3 != x2 || y3 != y2 ) {
				boxb( x3+mx,y3+my, x3+x,y3+y, 0x7fff );
				boxb( x2+mx,y2+my, x2+x,y2+y, 0x7fff );
			}
			x3 = x2;
			y3 = y2;
		}	while (mb);
		view( NX1,NY1, NX2,NY2 );
		vput2( nbx(x3+mx),nby(y3+my), nbx(x3+x),nby(y3+y), b );
	}
	EGB_writeMode( work, 0 );
	wkk();
}

/*
void boke(int mx, int my, int x, int y)
{
	int n=0x80, si, x1, y1, x2, y2;
	char pa[64];
	WORD(pa+0)=4;
	WORD(pa+2)=mx;
	WORD(pa+4)=my;
	WORD(pa+6)=x;
	WORD(pa+8)=my;
	WORD(pa+10)=x;
	WORD(pa+12)=y;
	WORD(pa+14)=mx;
	WORD(pa+16)=y;
	EGB_region( work, &n, &si, &x1,&y1, &x2,&y2, pa );
	EGB_resolve(work,b);
}
*/

void hten(int x, int y, int x2, int y2)
{
	EGB_writeMode( work, 4 );
	boxf( x,y, x2,y2, 0x7fff );
	EGB_writeMode( work, 0 );
}

void monocol(int x, int y, int x2, int y2)
{
	int i,h,s,v;
	if (x2<x) {	i=x; x=x2; x2=i; }
	if (y2<y) {	i=y; y=y2; y2=i; }
	egbget(x,y,x2,y2,b);
	for (i = 0; i<(x2-x+1)*(y2-y+1)*2; i+=2) {
		c32toHSV(WORD(b+i),&h,&s,&v);
		WORD(b+i) = (v>>3) * 0x421 | (WORD(b+i) & 0x8000);
	}
	vput2(x,y,x2,y2,b);
}

void monocol2(int x, int y, int x2, int y2)
{
	int i, gc,rc,bc;
	if (x2<x) {	i=x; x=x2; x2=i; }
	if (y2<y) {	i=y; y=y2; y2=i; }
	egbget(x,y,x2,y2,b);
	for (i = 0; i<(x2-x+1)*(y2-y+1)*2; i+=2) {
		gc = (WORD(b+i) >> 10) & 0x1f;
		rc = (WORD(b+i) >>  5) & 0x1f;
		bc =  WORD(b+i)		   & 0x1f;
		WORD(b+i) = (gc+rc+bc+1) / 3 * 0x421 | (WORD(b+i) & 0x8000);
	}
	vput2(x,y,x2,y2,b);
}

void tens(int mb, int mx, int my, void (*vic)())
{
	int x, y;
	mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
	EGB_writeMode( work, 0 );
	view(NX1,NY1,NX2,NY2);
	mx = nbx(mx);
	my = nby(my);
	x = nbx(x);
	y = nby(y);
	vic(mx,my,x,y);
	wkk();
}

void kakshk(int mb, int mx, int my)
{
	int x, y, x2, y2, ox, oy, ox2, oy2;
	ox = mx;
	oy = my;
	mwwp( &mb, &ox,&oy, &ox2,&oy2, boxb, 0 );
	egbget( nbx(ox),nby(oy), nbx(ox2),nby(oy2), b );
	boxb(ox,oy,ox2,oy2,0x7fff);
	x2 = abs(nbx(ox2)-nbx(ox))+1;
	y2 = abs(nby(oy2)-nby(oy))+1;
	mbin(&mb,&mx,&my);
	mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
	boxb(ox,oy,ox2,oy2,0x7fff);
	EGB_writeMode(work,0);
	egbputZ( nbx(mx),nby(my), nbx(x),nby(y), x2,y2, b );
	wkk();
}

void polys( int mb, int mx, int my, char *b )
{
	int i=6, x, y, ox, oy;
	view( WX1,WY1, WX2,WY2 );
	umosv( WX1,WY1, WX2,WY2 );
	ox = mx;
	oy = my;
	WORD(b+2) = wnx(mx);
	WORD(b+4) = wny(my);
	EGB_writeMode(work,4);
	line( wcx(mx),wcy(my), wcx(mx),wcy(my), 0x7fff );
	while(mb!=2 && i<1020) {
		do {
			x = mx;
			y = my;
			MOS_rdpos(&mb,&mx,&my);
			if (wcx(x)!=wcx(mx) || wcy(y)!=wcy(my)) {
				line( wcx(ox),wcy(oy), wcx(x),wcy(y), 0x7fff );
				line( wcx(ox),wcy(oy), wcx(mx),wcy(my), 0x7fff );
			}
		}	while(mb==0 || (mb==1 && wcx(ox)==wcx(mx) && wcy(oy)==wcy(my)));
		ox = mx;
		oy = my;
		WORD(b+i)   = wnx(mx);
		WORD(b+i+2) = wny(my);
		i+=4;
	}
	WORD(b)=(i-2)/4;
	view( NX1,NY1, NX2,NY2 );
	EGB_writeMode( work, 0 );
}

void polyg( int mb, int mx, int my )
{
	polys(mb, mx, my, b);
	EGB_writeMode( work, (vr==128) ? 0 : 7 );
	EGB_pastel( work, vr*2 );
	EGB_paintMode(work, 0x22);
	EGB_color(work, 0, mcl[1]);
	EGB_color(work, 2, mcl[1]);
	EGB_polygon( work, b );
	EGB_writeMode( work, 0 );
	EGB_pastel( work, 128 );
	wkk();
	mbout(&mb,&mx,&my);
}

void polyboke( int mb, int mx, int my )
{
	int n=0x80, si, x1, y1, x2, y2;
	char pa[2048];
	polys(mb, mx, my, pa);
	if (WORD(pa) >= 3) {
		EGB_region( work, &n, &si, &x1,&y1, &x2,&y2, pa );
		EGB_resolve(work, b);
	}
	wkk();
	mbout(&mb, &mx, &my);
}

void mnw( int mb, int mx, int my )		/*	編集窓	*/
{
	view( NX1, NY1, NX2, NY2 );
	switch(mei[0])
	{
	case 1:	mline( mb, mx, my, line );		break;
	case 2:	mline( mb, mx, my, boxb );		break;
	case 3:	mline( mb, mx, my, boxf );		break;
	case 4:	mline( mb, mx, my, circlen2 );	break;
	case 5:	mline( mb, mx, my, circlef2 );	break;
	case 6:	mline( mb, mx, my, circlenl );	break;
	case 7:	mline( mb, mx, my, circlefl );	break;
    case 8:	tens(mb, mx, my, udten);		break;
    case 9:	tens(mb, mx, my, lrten);		break;
	case 10: polyg( mb, mx, my );			break;
	case 11: mpaint( mb, mx, my );			break;
	case 12: mcpyl( mb, mx, my, 0 );		break;
	case 13: rollsander( mb, mx, my );		break;
/*	case 14: tens( mb, mx, my, boke );		break;	*/
	case 14: polyboke( mb, mx, my );		break;
	case 15: raten( mb, mx, my, WX1, WY1, WX2, WY2, NX1, NY1, NX2, NY2 );
				break;
	case 16: kakshk( mb, mx, my );			break;
	case 17: tens( mb, mx, my, hten );		break;
	case 18: tens( mb, mx, my, monocol2 );	break;
	case 19: tens( mb, mx, my, monocol );	break;
	default: mdr( mb, mx, my );				break;
	}
	mosv( 0,0, 639,479 );
	view( 0, 0, 1024/bi-1, 512/bi-1 );
}

void mbwk( int mx, int my, int c )	/*	バッファセット用枠	*/
{
	static int x = 0, y = 512, c2 = 0;
	int mx2, my2;
	if ( mx/bi < BX1 || mx/bi > BX2 || my/bi < BY1 || my/bi > BY2 )
		c = 0;
	if ( c == 0 ) {
		if ( c2 != 0 ) {
			wpg(0);
			boxb( x, y, x+NX4*bi-1, y+NY4*bi-1, 0 );
			wpg(1);
			y = 512;
		}
	} else {
		mx2 = gpx(mx)*bi;
		my2 = gpy(my)*bi;
		if ( x != mx2 || y != my2 || c2 == 0 ) {
			wpg(0);
			boxb( x, y, x+NX4*bi-1, y+NY4*bi-1, 0 );
			boxb( mx2, my2, mx2+NX4*bi-1, my2+NY4*bi-1, 15 );
			wpg(1);
			x = mx2;
			y = my2;
		}
	}
	c2 = c;
}

void bfsrgp( int mb, int mx, int my )	/*	重ね合わせ	*/
{
	int mx2, my2;
	mx2 = gpx(mx);
	my2 = gpy(my);
	if (mb == 1) {
		wget();
		vput2(mx2, my2, mx2+NX3, my2+NY3, wb );
	} else {
		egbget( NX1, NY1, NX2, NY2, b );
		egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
		vput2( 320, 0, 320+NX3, NY3, wb );
		EGB_color( work, 3, mcl[2] );
		EGB_writeMode( work, 6 );
		egbput( 320, 0, 320+NX3, NY3, b );
		EGB_writeMode( work, 0 );
		egbget( 320, 0, 320+NX3, NY3, wb );
		wput();
	}
}

void bfdraw( int mb, int mx, int my )
{
	int mx2, my2;
	mx2 = mx;
	my2 = my;
	while (mb != 0)	{
		if (mx2/bi < BX1 || mx2/bi > BX2 || my2/bi < BY1 || my2/bi > BY2 )
			break;
		line( mx2/bi, my2/bi, mx/bi, my/bi, mcl[mb] );
		mx2 = mx;
		my2 = my;
		MOS_rdpos( &mb, &mx, &my );
	}
}

void cols16(int mb, int mx, int my)
{
	int i;
	if (mb==1) {
		i=(mx-CSX1)/CSX4;
		boxf(CSX1+i*CSX4,CSY1,CSX1+i*CSX4+CSX3,CSY2,mcl[1]);
	} else {
		egbget( mx,my, mx,my, b );
		mcl[1] = WORD(b);
		mbclp();
	}
}

void cols16g(int mb)
{
	int f, i, j, k=0;
	egbget(NX1,NY1,NX2,NY2,b);
	for ( i=0; i<16; i++ ) {
		WORD(b+32768+i*2) = 0;
	}
	for (i = 0; i < NX4*NY4*2; i+=2) {
		f = 0;
		for (j=0; j<k; j++) {
			if (WORD(b+32768+j*2)==WORD(b+i)) {
				f = 1;
				break;
			}
		}
		if (f==0) {
			WORD(b+32768+k*2) = WORD(b+i);
			k++;
		}
		if (k>15)
			break;
	}
	egbget(CSX1, CSY1, CSX2-CSX4*k, CSY2, b+65536);
	vput2(CSX1+CSX4*k, CSY1, CSX2, CSY2, b+65536);
	egbputZ(CSX1, CSY1, CSX1+CSX4*k-1, CSY2, k,1, b+32768);
	mbout(&mb,&i,&j);
}

void brolls( int mb, int mx, int my )
{
	int x2, y2, x3, y3;
	mx = mx/bi;
	my = my/bi;
	do {
		MOS_rdpos( &mb, &x2, &y2 );
		x3 = mx - x2/bi & BX3;
		y3 = my - y2/bi & BY3;
		rollsub( x3, y3, BX1, BY1, BX3, BY3 );
		mx = x2/bi;
		my = y2/bi;
	}	while (mb);
}

void colch(int mb, int mx, int my)
{
	egbget( BX1,BY1, BX2,BY2, b );
	boxf( BX1,BY1, BX2,BY2, mcl[1] );
	EGB_writeMode(work,6);
	EGB_color(work,3,mcl[2]);
	egbput( BX1,BY1, BX2,BY2, b );
	EGB_writeMode(work,0);
	mbout(&mb, &mx, &my);
}

void pastgo(int mb, int mx, int my)
{
	int mx2, my2;
	mx2 = gpx(mx);
	my2 = gpy(my);
	if (mb == 1) {
		wget();
		vput2(mx2, my2, mx2+NX3, my2+NY3, wb );
	} else {
		egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
		EGB_writeMode( work, 7 );
		egbput( NX1, NY1, NX2, NY2, wb );
		EGB_writeMode( work, 0 );
		wkk();
		mbout(&mb,&mx,&my);
	}
}

void mbuff( int mb, int mx, int my )		/*	バッファ	*/
{
	void (*(vb[]))() ={ bfgp, bfsrgp, bfdraw, brolls, colch, pastgo};
	view( BX1, BY1, BX2, BY2 );
	vb[((mei[1]<6) ? mei[1] : 0)](mb, mx, my);
	view( 0, 0, 1024/bi-1, 512/bi-1 );
}

int OKM_fsel2( char *nn, char *tt, int f )
{
	if (OKM_fsel( nn, tt, 0 ) == 0 )
		return ((f!=0) ? sachk(nn) : 0 );
	else
		return (1);
}

void OKM_fsel3( char *nn, char *tt, int (*vp)(char *na), int f )
{
	if (OKM_fsel2( nn, tt, f ) == 0)
		vp( nn );
}

/*
int tomself(char *nn, char *ext )
{
	int ret;
	EGB_writePage(work,0);
	ret = TOM_filesel( work, nn, ext, 224, 60 );
	EGB_writePage(work,1);
	return (ret);
}

void tomself2(char *nn, char *ext, int (*fads)(char *, char *, int, int ) )
{
	if (tomself( nn, ext ) != 1)
		fads( work, nn, BX1, BY1 );
}
*/
/*
void mos2c(int mx, int my, int x1, int y1, int x2, int y2, void (*vf)())
{
	if ( x1 >= mx && mx <= x2 && y1 <= my && my <= y2 )
		vf(mb, mx, my);
}
*/

void mosmen(int mb, int mx, int my)
{
	static char nn[FILENAME_MAX];

	switch(MEN_menu( mb, mx, my ))
	{
	case 1:
		message2(4, "Ｇ-Ｐｅｎ３２ｋ    ver.1.063",
					"Free Software Collection Version",
					__DATE__" "__TIME__" Compiled.",
					"Copyright(C) 1991-1994 OKOME", 1);
		break;
	case 101:
		if (OKM_fsel2( nn, "TIFF読み込み", 0 ) == 0) {
			EGB_color(work, 0, mcl[1]);
			tiffload(nn, BX1, BY1);
		}
		break;
	case 102:
		if (OKM_fsel2( nn, "TIFF保存", 1 ) == 0)
			tiffsave(nn, BX1, BY1, BX2, BY2, 0, 0);
		break;
	case 103:
		if (OKM_fsel2( nn, "TIFF圧縮保存", 1 ) == 0) {
			MOS_typeRom2(82,16,16,mpat);
			tiffsave(nn, BX1, BY1, BX2, BY2, 1, 0);
			MOS_typeRom2(81,0,0,mpat);
		}
		break;
	case 104:
		if (OKM_fsel2( nn, "SPRITEload", 0 ) == 0)
			sprload( nn, BX1, BY1 );
		break;
	case 105:
		if (OKM_fsel2( nn, "SPRITEsave", 1 ) == 0)
			sprsave( nn, BX1, BY1 );
		break;
	case 106:
		if (OKM_fsel2( nn, "PATTERN4load", 0 ) == 0)
			ptnload4pg( nn, NX4,NY4 );
		break;
	case 107:
		if (OKM_fsel2( nn, "PATTERN4save", 1 ) == 0)
			ptnsave4pg( nn, NX4,NY4 );
		break;
	case 108:	OKM_fsel3( nn, "１６色LOAD", ptr16dlo, 0 );	break;
	case 109:	OKM_fsel3( nn, "１６色化SAVE", ptr16dsa, 1 );	break;
	case 110:	OKM_fsel3( nn, "Ｃ言語保存", cdasave, 1 );	break;
/*	case 201:	tomself2( nn, "*.pat", loadpat );	break;
	case 202:	tomself2( nn, "*.pat", savepat );	break;
	case 203:
		if (tomself( nn, "*.spr" ) != 1) {
			loadpeo( nn, b, vp0 );
			vput2( BX1,BY1, BX2,BY2, vp);
		}
		break;
	case 204:
		if (tomself( nn, "*.spr" ) != 1) {
			egbget( BX1, BY1, BX2, BY2, vp );
			savepeo( work, nn, b, vp0 );
		}
		break;
	case 205:
		if (tomself( nn, "*.ano" ) != 1) {
			loadano( work, nn, BX1, BY1 );
			vput2( BX1,BY1, BX2,BY2, vp);
		}
		break;
	case 206:	tomself2( nn, "*.ano", saveano );	break;
	case 207:	tomself2( nn, "*.fce", loadkao );	break;
	case 208:	tomself2( nn, "*.fce", savekao );	break;
	case 209:	tomself2( nn, "*.til", loadtil );	break;
	case 210:	tomself2( nn, "*.til", savetil );	break;
*/	case 201:	wpg(0);	wkugiri(3);	wpg(1);	break;
	case 202:	wpg(0);	wkugiri(2);	wpg(1);	break;
	case 203:	ten(NX1,NY1,NX4);	wkk();	break;
	case 204:	ten(BX1,BY1,BX4);			break;
	case 205:	vtengh();	break;
	case 206:	vtengs();	break;
	case 207:	vtengv();	break;
	case 208:	tometen(BX1,BY1,BX2,BY2);	break;
	case 209:
		EGB_writeMode( work, 10 );
		boxf(BX1-1, BY1-1, BX2+1, BY2+1,0x8000);
		EGB_writeMode( work, 0 );
		break;
	case 210:
		EGB_writeMode( work, 11 );
		boxf(BX1-1, BY1-1, BX2+1, BY2+1,0x8000);
		EGB_writeMode( work, 0 );
		break;
	case 9998:	wsize(mb,1);	break;
	case 5:
	case 9999:	endu();		break;
	default:	break;
	}
}

void keymod(unsigned int kb)
{
	switch(kb)
	{
	case 0x8016:
	case 0x9:	page(-1);	break;
	case 0x8017:
	case 0x1b:	page( 1);	break;
	case 'A':	aqy();		break;
	case 'B':	hten(NX1,NY1,NX2,NY2);	wkk();	break;
	case 'C':	wcls();		break;
	case 'D':	bcls();		break;
	case 'F':	udten(NX1,NY1,NX2,NY2);	wkk();	break;
	case 'G':	lrten(NX1,NY1,NX2,NY2);	wkk();	break;
	case 'H':	hten(BX1,BY1,BX2,BY2);			break;
	case 'K':	ten(NX1,NY1,NX4);		wkk();	break;
	case 'M':	monocol(BX1,BY1,BX2,BY2);		break;
	case 'Q':	aqx();		break;
	case 'S':	vtengs();	break;
	case 'V':	vtengv();	break;
	case 'W':	vtengh();	break;
	case 'X':	lrten(BX1,BY1,BX2,BY2);			break;
	case 'Y':	ten(BX1,BY1,BX4);				break;
	case 'Z':	udten(BX1,BY1,BX2,BY2);			break;
	case 0x801D:	endu();		break;
	default:
		if (strchr(MEN_skey,kb-'a'+'A')!=NULL)
			MEN_sideexec(strchr(MEN_skey,kb-'a'+'A')-MEN_skey+1);
		break;
	}
}

void mouse()		/*	マウス総合領域	*/
{
	int mb, mx, my, mx2, my2;
	unsigned int kb, en;
	while(1) {
		MOS_rdpos( &mb, &mx, &my );
		mx2 = mx / bi;
		my2 = my / bi;
		mbwk( mx, my, ( mei[1] == 2 || mei[1] == 3 ) ? 0 : 1 );
		if ((kb = KYB_read(1,&en)) != 0xffff)
			keymod(kb);
		if (mb)	{
			if ( mx2 >= WX1 && mx2 <= WX2 &&
				 my2 >= WY1 && my2 <= WY2 )
				mnw( mb, mx, my );	/*	編集窓	*/
			else if ( mx2 >= BX1 && mx2 <= BX2 &&
					  my2 >= BY1 && my2 <= BY2 )
					mbuff( mb, mx, my );	/*	バッファ	*/
			else if ( my2 >= PALY && my2 < (PALY+PALB*3) &&
					  mx2 >= PALX && mx2 <  PALX + 128)
					mcolm( mb, mx, my );	/*	カラーボックス	*/
			else if ( mx >= MEX1 && my >= MEY1 && mx < MEX1 + MEX4 * MEX2 &&
					  MEZ0 > ((mx-MEX1) / MEX4) + MEX2*(( my-MEY1 ) /MEY4 ))
					gmenu( mx, my );	/*	編集メニュー	*/
			else if ( mx2 >= PCX1 && mx2 <= PCX2 && 
					  my2 >= PCY1 && my2 <= PCY2 )
					mcolm2( mb );	/*	ボタンへ色セット	*/
			else if ( mx2 >= PRX1 && mx2 <= PRX2 &&
					  my2 >= PRY1 && my2 <= PRY2 )
					mcols( mcl[2-bc] );
			else if ( mx2 >= PLX1 && mx2 <= PLX2 &&
					  my2 >= PLY1 && my2 <= PLY2 )
					mcols( mcl[1+bc] );
			else if ( mx >= PAX1 && mx <= PAX2 &&
					  my >= PAY1 && my <= PAY2 )
					pbtn( mb );		/*	ページ変更	*/
			else if ( mx >= SPX1 && mx <= SPX2 &&
					  my >= SPY1 && my <= SPY2 )
					mspoit();
			else if ( mx2 >= CBX1 && mx2 <= CBX2 &&
					  my2 >= CBY1 && my2 <= CBY2 )
					tclc(mb, mx, my);
			else if ( mx2 >= CBLX1 && mx2 <= CBLX2 &&
					  my2 >= CBLY1 && my2 <= CBLY2 )
					colmix(mb, 0);
			else if ( mx2 >= CBRX1 && mx2 <= CBRX2 &&
					  my2 >= CBRY1 && my2 <= CBRY2 )
					colmix(mb, 1);
			else if ( mx2 >= NX1 && mx2 <= NX2 &&
					  my2 >= NY1 && my2 <= NY2 && NX4!=128 )
					wsize(mb, 0);
			else if ( mx2 >= PALX-12 && mx2 <= PALX-4 &&
					  my2 >= PALY && my2<= PALY+PALB*3-1 )
					hsrg(2);
			else if ( mx >= HX1 && mx <= HX2 &&
					  my >= HY1 && my <= HY2 )
					bfgs(mb);
			else if ( mx >= RX1 && mx <= RX2 &&
					  my >= RY1 && my <= RY2 )
					rchc();
			else if ( mx >= VX1 && mx <= VX2 &&
					  my >= VY1 && my <= VY2 )
					svpp(mx);
			else if ( mx2 >= CSX1 && mx2 <= CSX2 &&
					  my2 >= CSY1 && my2 <= CSY2 )
					cols16(mb, mx2, my2);
			else if ( mx >= CSBX1 && mx <= CSBX2 &&
					  my >= CSBY1 && my <= CSBY2 )
					cols16g(mb);
			else if ( my < 20 )	/*	MENUバー	*/
					mosmen( mb, mx, my );
		}
	}
}

_mwset_up_args()	{ return 0; }	/*	argc argvを使わない	*/

void main()
{
	int i;
	/*	初期化	*/
	EGB_init( work, EgbWorkSize );
	EGB_resolution( work, 0, GM0 );
	EGB_resolution( work, 1, GM1 );
	MOS_start( mwork, MosWorkSize );
	MOS_writePage( 0 );
	mosv( 0, 0, 639, 479 );
	MOS_typeRom2( 81, 1, 1, mpat );
	KYB_init();
	KYB_clic( 1 );
	KYB_setcode( 0x0200);
	kkinit(KAN_SCRN16, KAN_MOSON);
	NX1 = nx[3];
	NY1 = ny[3];
	NX4 = 64/bi;
	NY4 = NX4;
	wb = wallb;
	for (i=0; i<5; i++) {
		wallbl[i] = wb;
		wb+= 32<<(i*2);
	}
	wallbl[5] = &(b[256*512*2-128*128*2]);
	wb = wallbl[3];
	mcl[1] = 0x7fff;
	for (vz=2000; vp0 == NULL; vz--) {
		vp0 = (char *)calloc( (vz+1)*BX4*BY4*Cb/8, 1 );
	}
	vp = vp0;
	draw();		/*	画面作り	*/
	mouse();	/*	メインへ	*/
}
