/** << MSC V5.1 >> ************************************************************
**
**	パレットの確認 ( FMTOWNS 16 色モード ）
**
**	< Parameter >
**	GETBC  <Palno.>
**		   Palno. : ﾊﾟﾚｯﾄ番号 ( 0 〜 F (HEX) )
**
**	< HISTORY >
**	1989.10.07 : CREATE
**	1990.04.16 : FMRに対応
**	1990.11.30 : 新型FMTOWNSに対応
**
**	All Rights Reserved, Copyright (C) Y.Hirata 1990.
**
**	Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
#include	<stdio.h>
#include	<string.h>
#include	<conio.h>
#include	<dos.h>
#include	<stdlib.h>

#define		VER_LEV		(1.20)

/*		FMTOWNS				*/
#define		PALETTE		0xfd90
#define		BLUE		0xfd92
#define		RED			0xfd94
#define		GREEN		0xfd96
/*		FMR					*/
#define		CONTROL		0x0400
#define		R_PALETTE	0x0408
#define		R_BLUE		0x040a
#define		R_RED		0x040c
#define		R_GREEN		0x040e

unsigned int	Palette ;
unsigned int	Blue ;
unsigned int	Red ;
unsigned int	Green ;

char	*Msg[6] = {	"(C)パオパオ  ﾊﾟﾚｯﾄ色確認ﾌﾟﾛｸﾞﾗﾑ  Version ",
					"Copyright (C) Y.Hirata 1989-1990. All rights reserved.",
					"GETBC  <Palno.>  [Palno.  ....]  [Palno.-Palno.]",
					"       Palno. : ﾊﾟﾚｯﾄ番号 ( 0 〜 F (HEX) )",
					"                (背景色のﾊﾟﾚｯﾄ番号は、0 です｡)",
					"FMR-60では、最後に /r を指定して下さい｡"
					} ;

#define		TRUE	1
#define		FALSE	0

/*******************************  GET Machine ID  ****************************/
/*
**	< RETURN >
**	 機種識別 :
**				Towns1,2      = 1
**				Towns1,2(F,H) = 2 ('90秋型を含む)
**				R70           = 3
**				R60/50        = 4
**				R50S          = 5
**				R50LT         = 6
**				???           = 0
*/
int mid()
{
	union	REGS	regs ;
	struct	SREGS	sregs ;
	unsigned char	mdata[16] ;
	unsigned char	id, cpu ;
	
	regs.h.ah = 0x05 ;
	regs.x.di = (unsigned int)mdata ;

	segread( &sregs ) ;
	int86x( 0xaf,&regs,&regs,&sregs ) ;

	id = mdata[0] ;
	if ( (id & 0x07) == 0x01 ) {				/*  R60/50 系列	*/
		if ( (id & 0xf0) == 0x50 ) {			/*  FMTowns		*/
			cpu = inp( 0x31 ) ;
			switch ( cpu ) {
				case 1 :
						return ( 1 ) ;			/*  ﾓﾃﾞﾙ 1,2	*/
						break ;
				case 2 :
						return ( 2 ) ;			/*  ﾓﾃﾞﾙ 1,2(F,H)	*/
						break ;
				default :
						return ( 2 ) ;			/*  ?????		*/
/*
**	新型FMTOWNSは、これでいいと思う｡
*/
						break ;
			}
		} else if ( (id & 0xf0) == 0x20 ) {		/*  R-70		*/
			return ( 3 ) ;
		} else if ( (id & 0xf0) == 0x00 ) {		/*  R-60/50		*/
			return ( 4 ) ;
		} else if ( (id & 0xf0) == 0x30) {		/*  R-50S		*/
			return ( 5 ) ;
		} else if ( (id & 0xf0) == 0x40) {		/*  R-50LT		*/
			return ( 6 ) ;
		} else {								/*  ?????		*/
			return ( 0 ) ;
		}
	} else {									/*  ?????		*/
		return ( 0 ) ;
	}
}

/************************  char 0-f(F) -> int 0-15  **************************/
int ctoi( c )
char	c ;
{
	int	i=0 ;

	if ( c >= '0' && c <= '9' ) {
		i = c - '0' ;
	} else {
		if ( c >= 'A' && c <= 'F' )
			i = 10 + c - 'A' ;
		if ( c >= 'a' && c <= 'f' )
			i = 10 + c - 'a' ;
	}
	return i ;
}

/*****************************  ★ メイン ★  ********************************/
main( int ac, char *av[] )
{
	char	pal, b, r, g ;
	int		c, cc, st, end, arglen ;
	int		id ;
	int		r60 = FALSE ;

	if ( ac > 1 ) {
		for ( c=1; c<ac; c++ ) {
			if ( *av[c] == '-' || *av[c] == '/' ) {		/* ｵﾌﾟｼｮﾝｽｲｯﾁ	*/
				arglen = strlen( av[c] ) ;
				for ( cc=1; cc<arglen; cc++ ) {
					switch ( *(av[c]+cc) ) {
						case 'r' :
						case 'R' :
							r60 = TRUE ;
							break ;
						default :
							printf("\x1b[1;33m") ;
							printf("Option switch error(%c)",*(av[c]+cc)) ;
							printf("\x1b[m\n") ;
							break ;
					}
				}
			}
		}
	}
	id = mid() ;
	switch ( id ) {							/*  機種判別	*/
		case 1 :							/*  FMTOWNS		*/
		case 2 :							/*  FMTOWNS		*/
		case 5 :							/*  FMR-50S		*/
				Palette = PALETTE ;
				Blue = BLUE ;
				Red = RED ;
				Green = GREEN ;
				break ;
		case 4 :							/*  FMR-60/50	*/
				Palette = PALETTE ;
				Blue = BLUE ;
				Red = RED ;
				Green = GREEN ;
				if ( !r60 ) {
					break ;
				}
		case 3 :							/*  FMR-70		*/
				outp( CONTROL ,0x05 ) ;
				Palette = R_PALETTE ;
				Blue = R_BLUE ;
				Red = R_RED ;
				Green = R_GREEN ;
				break ;
		case 6 :							/*  FMR-50LT	*/
		default :							/*  ?????		*/
				printf("\nこのマシンでは、使用できません！\n") ;
				exit ( 1 ) ;
				break ;
	}

	if ( ac < 2 ) {								/*  引数なし	*/
		printf("%s%04.2f\n",Msg[0],VER_LEV) ;
		printf("%s\n",Msg[1]) ;
		printf("\n") ;
		for ( c=2; c<5; c++ ) {
			printf("%s\n",Msg[c]) ;
		}
		if ( id == 4 ) {
			printf("%s\n",Msg[5]) ;
		}
	} else {									/*  引数あり	*/
		for ( c=1; c<ac; c++ ) {
			if ( *av[c] != '-' && *av[c] != '/' ) {		/* ｵﾌﾟｼｮﾝｽｲｯﾁ	*/
				st  = ctoi( *av[c] ) ;
				end = st ;
				if ( strlen(av[c]) == 3 ) {
					end = ctoi( *(av[c]+2) ) ;
					if ( st > end )
						printf("\x1b[1;33mParameter error : %s\x1b[m\n",
								av[c]) ;
				}
				for ( cc=st; cc<=end; cc++ ) {
					pal = cc ;
					printf("\x1b[m\x1b[37mPalno. %xH : ",pal) ;
					outp( Palette ,pal ) ;
					b = inp( Blue  ) >> 4 ;
					r = inp( Red   ) >> 4 ;
					g = inp( Green ) >> 4 ;
					printf("\x1b[7;34mBLUE\x1b[m\x1b[37m<%xH> ",b) ;
					printf("\x1b[7;31mRED\x1b[m\x1b[37m<%xH> ",r) ;
					printf("\x1b[7;32mGREEN\x1b[m\x1b[37m<%xH>\n",g) ;
				}
			}
		}
	}
	printf("\x1b[m") ;
}

