#include <stdio.h>
#include <math.h>
#include <string.h>

#define ScnMode	12
#define	DspXs	640
#define	DspYs	480

#define	DWORD(x)	*((unsigned int			*)(x))
#define	WORD(x)		*((unsigned short int	*)(x))
#define	BYTE(x)		*((unsigned char		*)(x))

char para[64];
char gwork[1540];
char mwork[4096];
short int green[256], red[256], blue[256];
struct{
	short int pti;
	char ptno[4], grn[4], rd[4], bl[4];
} table[300];

void p_grb( short int *pg, short int *pr, short int *pb );
void itoa(short int n, char s[]);
void reverse( char s[]);

void usage(void)
{ 
	printf("usage--------------------------------------------------------\n\n");
	printf("     run386 col256 [output_filename]\n");
	printf("         Program terminated When right bottan is clicked\n");
	printf("         Select colorbox in order of your color_palett\n\n");
	
	printf("Hit any key !!\n");
	getchar();
}

void main( int argc, char **argv)
{
	long int	l;
    short int	i,j,max,k,b,x,y;
	short int x_pallet, y_pallet, pallet;
	char moji[5][7]={"選択色", "ﾊﾟﾚｯﾄn", "Ｇreen", "Ｒed", "Ｂule"}; 
	FILE *fp;

/*	usage();*/
	p_grb(green, red, blue);
	
	EGB_init(gwork,1536);					/* 画面初期化､作業領域確保	*/
	EGB_resolution(gwork, 0, ScnMode);		/* 画面0モード	*/
	EGB_resolution(gwork, 1, ScnMode);		/* 画面1モード	*/
	EGB_displayPage(gwork, 0, 3 ) ;			/* 表示ページの設定 上=0､下=1*/

	EGB_writePage(gwork,0);					/* 書き込みページ 0について  */
	EGB_displayStart(gwork, 0,0,0 );			/* 表示開始位置の設定*/
	EGB_displayStart(gwork, 1,0,0 );			/* スクロールの設定*/
	
	EGB_box(gwork, 1, 1, DspXs-1, DspYs-1 ); 		/* 外枠 */

	EGB_singleLine(gwork, 20,360,626,360); /* 表 */
	for(i=0; i<5; i++)
		EGB_singleLine(gwork, 20,i*20+390,626,i*20+390); 
	EGB_singleLine(gwork, 20,360,20,470); 
	for(i=0; i<=15; i++)
		EGB_singleLine(gwork, 80+39*i,360,80+39*i,470); 

	WORD( para + 0 )=28;					/* 項目名 */
	for(i=0; i<5; i++){
		WORD( para + 2 )=388+20*i;
		WORD( para + 4 )=strlen(moji[i]);
		strcpy(para+6, moji[i]);
		EGB_sjisString(gwork, para);
	}
	
	EGB_paintMode( gwork, 0x22 );			/* カラーパレットの作成*/
	for(j=0; j<8; j++){
		b=0;
		for(i=0; i<32; i++)	{
			if(i%4==0 ) b+=2; 
			EGB_paintColor(gwork,j*32+i);
			EGB_box(gwork, 8+i*19+b, 10+j*40, 8+i*19+17+b, 10+j*40+35 ); 
		}
	}

	MOS_start( mwork, 4096 ) ;			/* マウスの初期化 */
	MOS_resolution( 0, 12 ) ;			/* マウスは16色側のページに表示 */
	MOS_writePage( 0 ) ;
	MOS_disp( 1 ) ;						/* マウスを表示する */

	max=0;
	do {
		MOS_rdpos( &b, &x, &y ) ; 		/* マウス座標の読み取り */
		if( b == 1 ){ 					/* 左ボタンが押されたら */
			x_pallet=0;
			if(x>8 && x<84) 	x_pallet=(x-8)/19;
			if(x>86 && x<162)	x_pallet=(x-86)/19+4;
			if(x>164 && x<240)	x_pallet=(x-164)/19+8;
			if(x>242 && x<318)	x_pallet=(x-242)/19+12;
			if(x>320 && x<396)	x_pallet=(x-320)/19+16;
			if(x>398 && x<474)	x_pallet=(x-398)/19+20;
			if(x>476 && x<552)	x_pallet=(x-476)/19+24;
			if(x>554 && x<630)	x_pallet=(x-554)/19+28;
			y_pallet=(y-10)/40;
			pallet=table[max].pti=x_pallet+32*y_pallet;

			itoa(pallet, table[max].ptno);
			itoa(red[pallet], table[max].rd);
			itoa(green[pallet], table[max].grn);
			itoa(blue[pallet], table[max].bl);

			EGB_paintColor(gwork,0);
			EGB_box(gwork, 80,360,626,470);
			EGB_singleLine(gwork, 80,390,626,390); /* 表の再表示 */
			for(i=0; i<3; i++)
				EGB_singleLine(gwork, 80,i*20+410,626,i*20+410); 
			for(i=0; i<=14; i++)
				EGB_singleLine(gwork, 80+39*i,360,80+39*i,470); 

			for(k=max; k>=0 && (max-k)<14 ; k--){

				EGB_paintColor(gwork,table[k].pti);
				EGB_box(gwork, 80+39*(max-k),360,119+39*(max-k),390);

				WORD( para + 0 )=85+39*(max-k);
				WORD( para + 2 )=408;
				WORD( para + 4 )=strlen(table[k].ptno);
				strcpy(para+6, table[k].ptno);
				EGB_sjisString(gwork, para);
				
				WORD( para + 0 )=85+39*(max-k);
				WORD( para + 2 )=428;
				WORD( para + 4 )=strlen(table[k].grn);
				strcpy(para+6, table[k].grn);
				EGB_sjisString(gwork, para);
				
				WORD( para + 0 )=85+39*(max-k);
				WORD( para + 2 )=448;
				WORD( para + 4 )=strlen(table[k].rd);
				strcpy(para+6, table[k].rd);
				EGB_sjisString(gwork, para);
				
				WORD( para + 0 )=85+39*(max-k);
				WORD( para + 2 )=468;
				WORD( para + 4 )=strlen(table[k].bl);
				strcpy(para+6, table[k].bl);
				EGB_sjisString(gwork, para);
			}				
			max++;
			for(l=0; l<300000; l++);	/* wait */
		}
	} while( b != 2 ) ;					/* 右ボタンでループを終わる */

	max--;
	MOS_end() ;							/*  マウスの停止(忘れないように) */

	if(argc>1){
		fp=fopen( *(argv+1),"wt");
		for(k=max; k>=0 && (max-k)<14 ; k--){
			fprintf(fp,"\tGDS_palette(%2i,%4s,%4s,%4s);\t\t/* ﾊﾟﾚｯﾄ番号=%3s/256 */\n"			,(max-k+1),table[k].rd,table[k].grn,table[k].bl,table[k].ptno);
		}
	}
	screenterm(gwork);
}

void p_grb( short int *pg, short int *pr, short int *pb )
{
	short int p,g,r,b,gi,ri,bi;

	p=0;
	for(gi=0; gi<256; gi+=32){
		for(ri=0; ri<256; ri+=32){
			for(bi=0; bi<256; bi+=64){
				g=gi;
				r=ri;
				b=bi;
				if(gi != 0) g+=31;
				if(ri != 0) r+=31;
				if(bi != 0) b+=63;
				pg[p]=g;
				pr[p]=r;
				pb[p]=b;
				p++;
			}
		}
	}
}

void itoa(short int n, char s[])
{
	short int	i, sign;
	
	if( (sign=n)<0 )
		n=-n;
		
	i=0;
	do{
		s[i++] = n % 10+'0';
	} while( (n /= 10)>0 );
	if(sign<0)
		s[i++]='-';
	s[i]='\0';
	reverse(s);
}

/* 文字列を逆順にする */
void reverse( char s[])
{
	short int	c, i, j;
	
	for(i=0, j=strlen(s)-1; i<j; i++,j--){
		c=s[i];
		s[i]=s[j];
		s[j]=c;
	}
}

