/* << HighC V1.7 >> [FM-TOWNS] **********************************************
*
*	.PVS 表示ﾌﾟﾛｸﾞﾗﾑ
*	----------------------------------------------------------------------
*	Programmed by Y.Hirata ( NIFTY-ID: NAB03321  パオパオ )
*
*	NOTE: TAB=4
****************************************************************************/

#include <string.h>		/*  movedata	*/
#include <stdlib.h>		/*  malloc,free	*/
#include <conio.h>		/*  inp,outp	*/
#include <fmcfrb.h>		/*  TIM_*		*/
#include <msdos.cf>		/*  getds		*/
#include <mos.h>		/*  MOS_*		*/
#include <snd.h>		/*  SND_*		*/
#include "egbtxt.h"
#include "pvd.h"
#include "tiffhead.h"

char	Mwork[MosWorkSize] ;					/*  MOS作業領域			*/
char	_mos_cur[258] ;							/*  ﾏｳｽｶｰｿﾙ(ｱｲｺﾝ)		*/
char	_tmp[TMP_SIZE] ;						/*  作業領域			*/

_PAL_16		_palini = {	16,						/*  16色ﾃﾞﾌｫﾙﾄﾊﾟﾚｯﾄ		*/
						0,		0x00,	0x00,	0x00,	0,
						1,		0xB0,	0x00,	0x00,	0,
						2,		0x00,	0xB0,	0x00,	0,
						3,		0xB0,	0xB0,	0x00,	0,
						4,		0x00,	0x00,	0xB0,	0,
						5,		0xB0,	0x00,	0xB0,	0,
						6,		0x00,	0xB0,	0xB0,	0,
						7,		0xB0,	0xB0,	0xB0,	0,
						8,		0x00,	0x00,	0x00,	0,
						9,		0xF0,	0x00,	0x00,	0,
						10,		0x00,	0xF0,	0x00,	0,
						11,		0xF0,	0xF0,	0x00,	0,
						12,		0x00,	0x00,	0xF0,	0,
						13,		0xF0,	0x00,	0xF0,	0,
						14,		0x00,	0xF0,	0xF0,	0,
						15,		0xF0,	0xF0,	0xF0,	0
} ;
_PAL_16		_pal160, _pal161 ;					/*  16色ﾊﾟﾚｯﾄ設定用		*/
_PAL_256	_pal256 ;							/*  256色ﾊﾟﾚｯﾄ設定用	*/

char	*_msg[] = {
		"page 0                                        page 1      表示",
		"　１ ( 640 * 400  16   24KHz  ﾉﾝｲﾝﾀﾚｰｽ )        １       page 0",
		"　２ ( 640 * 200  16   24KHz  ﾉﾝｲﾝﾀﾚｰｽ )        ２       page 1",
		"　３ ( 640 * 480  16   31KHz  ﾉﾝｲﾝﾀﾚｰｽ )        ３       0 前面",
		"　４ ( 640 * 400  16   24KHz  ﾉﾝｲﾝﾀﾚｰｽ )        ４       1 前面",
		"　５ ( 256 * 256  32K  31KHz  ﾉﾝｲﾝﾀﾚｰｽ )        ５",
		"　６ ( 256 * 256  32K  24KHz  ﾉﾝｲﾝﾀﾚｰｽ )        ６       X0 1倍",
		"　７ ( 256 * 240  32K  15KHz    ｲﾝﾀﾚｰｽ )        ７          2倍",
		"　８ ( 256 * 240  32K  15KHz  ﾉﾝｲﾝﾀﾚｰｽ )        ８          4倍",
		"　９ ( 360 * 240  32K  15KHz    ｲﾝﾀﾚｰｽ )        ９       Y0 1倍",
		"１０ ( 320 * 240  32K  31KHz  ﾉﾝｲﾝﾀﾚｰｽ )      １０          2倍",
		"１１ ( 320 * 240  32K  15KHz  ﾉﾝｲﾝﾀﾚｰｽ )      １１          4倍",
		"１２ ( 640 * 480  256  31KHz  ﾉﾝｲﾝﾀﾚｰｽ )                 X1 1倍",
		"１３ ( 640 * 400  256  24KHz  ﾉﾝｲﾝﾀﾚｰｽ )                    2倍",
		"１４ ( 720 * 480  256  15KHz    ｲﾝﾀﾚｰｽ )     MS-DOS         4倍",
		"１５ ( 320 * 480  32K  31KHz  ﾉﾝｲﾝﾀﾚｰｽ )                 Y1 1倍",
		"１６ ( 320 * 480  32K  15KHz    ｲﾝﾀﾚｰｽ )                    2倍",
		"１７ ( 512 * 480  32K  31KHz  ﾉﾝｲﾝﾀﾚｰｽ )                    4倍",
		"１８ ( 512 * 480  32K  15KHz    ｲﾝﾀﾚｰｽ )",
		"実行   終了   TIFF保存"
} ;

struct {
	int		xs, ys ;
	int		xe, ye ;
} _dpara[] = {
/*  0	*/		{	48,		40,		-1,		55		},		/*  ﾀｲﾄﾙ	*/
/*  1	*/		{	48,		60,		367,	75		},		/*  0-1		*/
/*  2	*/		{	48,		80,		367,	95		},		/*  0-2		*/
/*  3	*/		{	48,		100,	367,	115		},		/*  0-3		*/
/*  4	*/		{	48,		120,	367,	135		},		/*  0-4		*/
/*  5	*/		{	48,		140,	367,	155		},		/*  0-5		*/
/*  6	*/		{	48,		160,	367,	175		},		/*  0-6		*/
/*  7	*/		{	48,		180,	367,	195		},		/*  0-7		*/
/*  8	*/		{	48,		200,	367,	215		},		/*  0-8		*/
/*  9	*/		{	48,		220,	367,	235		},		/*  0-9		*/
/*  10	*/		{	48,		240,	367,	255		},		/*  0-10	*/
/*  11	*/		{	48,		260,	367,	275		},		/*  0-11	*/
/*  12	*/		{	48,		280,	367,	295		},		/*  0-12	*/
/*  13	*/		{	48,		300,	367,	315		},		/*  0-13	*/
/*  14	*/		{	48,		320,	367,	335		},		/*  0-14	*/
/*  15	*/		{	48,		340,	367,	355		},		/*  0-15	*/
/*  16	*/		{	48,		360,	367,	375		},		/*  0-16	*/
/*  17	*/		{	48,		380,	367,	395		},		/*  0-17	*/
/*  18	*/		{	48,		400,	367,	415		},		/*  0-18	*/
/*  19	*/		{	416,	60,		447,	75		},		/*  1-1		*/
/*  20	*/		{	416,	80,		447,	95		},		/*  1-2		*/
/*  21	*/		{	416,	100,	447,	115		},		/*  1-3		*/
/*  22	*/		{	416,	120,	447,	135		},		/*  1-4		*/
/*  23	*/		{	416,	140,	447,	155		},		/*  1-5		*/
/*  24	*/		{	416,	160,	447,	175		},		/*  1-6		*/
/*  25	*/		{	416,	180,	447,	195		},		/*  1-7		*/
/*  26	*/		{	416,	200,	447,	215		},		/*  1-8		*/
/*  27	*/		{	416,	220,	447,	235		},		/*  1-9		*/
/*  28	*/		{	416,	240,	447,	255		},		/*  1-10	*/
/*  29	*/		{	416,	260,	447,	275		},		/*  1-11	*/
/*  30	*/		{	504,	60,		551,	75		},		/*  page0	*/
/*  31	*/		{	504,	80,		551,	95		},		/*  page1	*/
/*  32	*/		{	504,	100,	551,	115		},		/*  0前面	*/
/*  33	*/		{	504,	120,	551,	135		},		/*  1前面	*/
/*  34	*/		{	384,	420,	415,	435		},		/*  実行	*/
/*  35	*/		{	440,	420,	471,	435		},		/*  終了	*/
/*  36	*/		{	504,	160,	551,	175		},		/*  0 X1倍	*/
/*  37	*/		{	504,	180,	551,	195		},		/*  0 X2倍	*/
/*  38	*/		{	504,	200,	551,	215		},		/*  0 X4倍	*/
/*  39	*/		{	504,	220,	551,	235		},		/*  0 Y1倍	*/
/*  40	*/		{	504,	240,	551,	255		},		/*  0 Y2倍	*/
/*  41	*/		{	504,	260,	551,	275		},		/*  0 Y4倍	*/
/*  42	*/		{	504,	280,	551,	295		},		/*  1 X1倍	*/
/*  43	*/		{	504,	300,	551,	315		},		/*  1 X2倍	*/
/*  44	*/		{	504,	320,	551,	335		},		/*  1 X4倍	*/
/*  45	*/		{	504,	340,	551,	355		},		/*  1 Y1倍	*/
/*  46	*/		{	504,	360,	551,	375		},		/*  1 Y2倍	*/
/*  47	*/		{	504,	380,	551,	395		},		/*  1 Y4倍	*/
/*  48	*/		{	408,	320,	455,	335		},		/*  MS-DOS	*/
/*  49	*/		{	496,	420,	559,	435		}		/*  TIF保存	*/
} ;

_SELECT_PARA	_para = {						/*  選択状態の情報		*/
				NULL,	NULL,	NULL,
				3,	3,	3,
				1,1,	1,1,	0,0,	0,0,	0,0,	0,0,
				0,0,	0,0
} ;

_SCREEN_PARA	_screen[] = {					/*  画面ﾓｰﾄﾞの情報		*/
				{	4,	640,400,	640, 819,	1,1		},	/*   1:16	*/
				{	4,	640,200,	640, 819,	1,2		},	/*   2:16	*/
				{	4,	640,480,	1024,512,	1,1		},	/*   3:16	*/
				{	4,	640,400,	1024,512,	1,1		},	/*   4:16	*/
				{	16,	256,256,	256, 512,	1,1		},	/*   5:32K	*/
				{	16,	256,256,	256, 512,	1,1		},	/*   6:32K	*/
				{	16,	256,240,	256, 512,	3,1		},	/*   7:32K	*/
				{	16,	256,240,	256, 512,	3,1		},	/*   8:32K	*/
				{	16,	360,240,	512, 256,	3,1		},	/*   9:32K	*/
				{	16,	320,240,	512, 256,	1,1		},	/*  10:32K	*/
				{	16,	320,240,	512, 256,	3,1		},	/*  11:32K	*/
				{	8,	640,480,	1024,512,	1,1		},	/*  12:256	*/
				{	8,	640,400,	1024,512,	1,1		},	/*  13:256	*/
				{	8,	720,480,	1024,512,	2,1		},	/*  14:256	*/
				{	16,	320,480,	512, 512,	2,1		},	/*  15:32K	*/
				{	16,	320,480,	512, 512,	3,1		},	/*  16:32K	*/
				{	16,	512,480,	512, 512,	1,1		},	/*  17:32K	*/
				{	16,	512,480,	512, 512,	1,1		}	/*  18:32K	*/
} ;									/*  初期倍率 : 1=1倍, 2=2倍, 3=4倍	*/

/*  MS-DOS mode
---------------- */
int		_crtc[] = {
		0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
		0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
		0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
		0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150
} ;
#if 0
char 	_vdc[] = {	0x15,0x09	} ;
#endif
int		_crtc_dos[] = {
		0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
		0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
		0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
		0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150
} ;

long 	_tim0=0 ;								/*  ｶｳﾝﾀ				*/
long 	_tim1=0 ;								/*  ｶｳﾝﾀ				*/

static int int_handler( void )
{
	_tim0++ ;
	_tim1++ ;
	return 0 ;
}

void crtc_out( int reg )
{
	outp( 0x440,reg ) ;
	outpw( 0x442,_crtc[reg] ) ;
}

void mosBreak( void )
{
	int		mbot, mx, my ;

	do {
		MOS_rdpos( &mbot,&mx,&my ) ;			/*  ﾏｳｽ情報取得			*/
	} while ( mbot ) ;							/*  ﾎﾞﾀﾝonの間			*/
}

int mosButton( void )
{
	int		mbot, mx, my ;

	MOS_rdpos( &mbot,&mx,&my ) ;				/*  ﾏｳｽ情報取得			*/
	return mbot ;
}

void ginit( void )
{
	EGB_init( Gwork,EgbWorkSize ) ;				/*  初期化				*/
	EGB_resolution( Gwork,0,3 ) ;				/*  page0 16 color		*/
	EGB_resolution( Gwork,1,3 ) ;				/*  page1 16 color		*/
	EGB_displayPage( Gwork,0,1 ) ;				/*  page0のみ表示		*/
	EGB_writePage( Gwork,0 ) ;					/*  page0を処理開始		*/
	EGB_paintMode( Gwork,0x02 ) ;
	EGB_writeMode( Gwork,M_OPAQUE ) ;
	EGB_palette( Gwork,0,(char *)&_palini ) ;	/*  VSYNC待たずに設定	*/
	EGB_color( Gwork,C_FRONT,C_HWHITE ) ;		/*  文字色				*/
	EGB_color( Gwork,C_BACK,C_BLACK ) ;			/*  背景色				*/
	EGB_clearScreen( Gwork ) ;					/*  画面ｸﾘｱ				*/
}

void minit( void )
{
	MOS_start( Mwork,MosWorkSize ) ;			/*  初期化				*/
	MOS_resolution( 0,3 ) ;						/*  page0, 16 color		*/
	MOS_typeRom( 87,0,0,_mos_cur ) ;			/*  ﾏｳｽ形状変更			*/
	MOS_color( 0,C_HWHITE ) ;					/*  ﾏｳｽ表示色設定		*/
	MOS_setpos( 320,240 ) ;						/*  画面中央			*/
	MOS_disp( FALSE ) ;							/*  非表示				*/
}

void to_vram( void )
{
	int		cnt, off ;

	if ( _para.buf != NULL ) {
		movedata( getds(),(unsigned int)_para.buf,0x120,0,VRAM_SIZE ) ;
		return ;
	}
	if ( fseek( _para.fp,VRAM_OFFSET,SEEK_SET ) ) return ;
	for ( cnt=0, off=0; cnt<512; cnt++, off+=TMP_SIZE ) {
		if ( fread( _tmp,1,TMP_SIZE,_para.fp ) != TMP_SIZE ) break ;
		movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
	}
}

void reverse( int old,int new )
{
	int		xs, ys, xe, ye ;

	if ( old == new ) return ;
	MOS_disp( FALSE ) ;							/*  ﾏｳｽ非表示			*/
	if ( old > SEL_TIT && old < SEL_MAX ) {
		xs = _dpara[old].xs - 2 ;
		ys = _dpara[old].ys - 1 ;
		xe = _dpara[old].xe + 2 ;
		ye = _dpara[old].ye + 1 ;
		box( xs,ys,xe,ye ) ;
	}
	if ( new > SEL_TIT && new < SEL_MAX ) {
		xs = _dpara[new].xs - 2 ;
		ys = _dpara[new].ys - 1 ;
		xe = _dpara[new].xe + 2 ;
		ye = _dpara[new].ye + 1 ;
		box( xs,ys,xe,ye ) ;
	}
	MOS_disp( TRUE ) ;							/*  ﾏｳｽ表示				*/
}

int select_msdos( void )
{
	if ( _para.p0 < 1 ) return 1 ;				/*  MS-DOSだった		*/
	reverse( _para.p0,-1 ) ;					/*  page0のﾓｰﾄﾞ解除		*/
	reverse( _para.disp+D0_0-1,-1 ) ;			/*  表示ﾍﾟｰｼﾞ解除		*/
	reverse( _para.zx0+P0_X1-1,-1 ) ;			/*  page0のX倍率解除	*/
	reverse( _para.zy0+P0_Y1-1,-1 ) ;			/*  page0のY倍率解除	*/
	if ( _para.p0 < 12 ) {						/*  2画面ﾓｰﾄﾞだった		*/
		reverse( _para.p1+P1_1-1,-1 ) ;			/*  page1のﾓｰﾄﾞ解除		*/
		reverse( _para.zx1+P1_X1-1,-1 ) ;		/*  page1のX倍率解除	*/
		reverse( _para.zy1+P1_Y1-1,-1 ) ;		/*  page1のY倍率解除	*/
	}
	_para.disp = 4 ;							/*  page1前面			*/
	reverse( -1,_para.disp+D0_0-1 ) ;			/*  表示ﾍﾟｰｼﾞ設定		*/

	_para.zx0 = _para.zy0 = 1 ;
	reverse( -1,_para.zx0+P0_X1-1 ) ;			/*  page0のX倍率設定	*/
	reverse( -1,_para.zy0+P0_Y1-1 ) ;			/*  page0のY倍率設定	*/

	_para.zx1 = _para.zy1 = 1 ;
	reverse( -1,_para.zx1+P1_X1-1 ) ;			/*  page1のX倍率設定	*/
	reverse( -1,_para.zy1+P1_Y1-1 ) ;			/*  page1のY倍率設定	*/

	_para.p0 = _para.p1 = -1 ;					/*  page0/1ﾓｰﾄﾞ無効		*/
	return 0 ;
}

int select_page0( int sel )
{
	if ( _para.p0 < 0 ) {						/*  MS-DOSだった		*/
		reverse( SEL_DOS,-1 ) ;					/*  MS-DOS解除			*/
	} else {									/*  MS-DOSではなかった	*/
		reverse( _para.p0,-1 ) ;				/*  page0のﾓｰﾄﾞ解除		*/
		if ( _para.p0 < 12 ) {					/*  2画面ﾓｰﾄﾞだった		*/
			reverse( _para.p1+P1_1-1,-1 ) ;		/*  page1のﾓｰﾄﾞ解除		*/
		}
	}
	reverse( _para.disp+D0_0-1,-1 ) ;			/*  表示ﾍﾟｰｼﾞ解除		*/
	reverse( _para.zx0+P0_X1-1,-1 ) ;			/*  page0のX倍率解除	*/
	reverse( _para.zy0+P0_Y1-1,-1 ) ;			/*  page0のY倍率解除	*/
	if ( _para.p0 < 12 ) {						/*  2画面ﾓｰﾄﾞだった		*/
		reverse( _para.zx1+P1_X1-1,-1 ) ;		/*  page1のX倍率解除	*/
		reverse( _para.zy1+P1_Y1-1,-1 ) ;		/*  page1のY倍率解除	*/
	}

	_para.zx0 = _screen[sel-1].zx ;
	_para.zy0 = _screen[sel-1].zy ;
	reverse( -1,_para.zx0+P0_X1-1 ) ;			/*  page0のX倍率設定	*/
	reverse( -1,_para.zy0+P0_Y1-1 ) ;			/*  page0のY倍率設定	*/
	if ( sel < 12 ) {							/*  2画面ﾓｰﾄﾞ			*/
		_para.p1 = sel ;
		reverse( -1,_para.p1+P1_1-1 ) ;			/*  page1の画面ﾓｰﾄﾞ設定	*/
		_para.disp = 3 ;						/*  page0前面			*/
		reverse( -1,_para.disp+D0_0-1 ) ;		/*  表示ﾍﾟｰｼﾞ設定		*/
		_para.zx1 = _screen[sel-1].zx ;
		_para.zy1 = _screen[sel-1].zy ;
		reverse( -1,_para.zx1+P1_X1-1 ) ;		/*  page1のX倍率設定	*/
		reverse( -1,_para.zy1+P1_Y1-1 ) ;		/*  page1のY倍率設定	*/
	} else {									/*  1画面ﾓｰﾄﾞ			*/
		_para.p1 = -1 ;							/*  page1の画面ﾓｰﾄﾞ無効	*/
		_para.disp = 1 ;						/*  page0のみ表示		*/
		reverse( -1,_para.disp+D0_0-1 ) ;		/*  表示ﾍﾟｰｼﾞ設定		*/
		_para.zx1 = _para.zy1 = -1 ;			/*  page1の倍率無効		*/
	}
	_para.p0 = sel ;							/*  page0の画面ﾓｰﾄﾞ		*/
	return 0 ;
}

int page1_check( int p1 )
{
	if ( _para.p0 == 1 ) {
		if ( p1 == 1 || p1 == 4 ) return 0 ;
	} else if ( _para.p0 == 2 ) {
		if ( p1 == 2 ) return 0 ;
	} else if ( _para.p0 == 3 || _para.p0 == 5 || _para.p0 == 10 ) {
		if ( p1 == 3 || p1 == 5 || p1 == 10 ) return 0 ;
	} else if ( _para.p0 == 4 || _para.p0 == 6 ) {
		if ( p1 == 4 || p1 == 6 ) return 0 ;
	} else if ( _para.p0 == 7 || _para.p0 == 9 ) {
		if ( p1 == 7 || p1 == 9 ) return 0 ;
	} else if ( _para.p0 == 8 || _para.p0 == 11 ) {
		if ( p1 == 8 || p1 == 11 ) return 0 ;
	}
	return 1 ;
}

int select_page1( int sel )
{
	if ( _para.p0 < 1 || _para.p0 > 11 ) return 1 ;
	sel -= ( P1_1 - 1 ) ;
	if ( page1_check( sel ) ) return 1 ;
	reverse( _para.p1+P1_1-1,-1 ) ;				/*  選択状態解除		*/
	reverse( _para.disp+D0_0-1,-1 ) ;			/*  表示ﾍﾟｰｼﾞ解除		*/
	_para.disp = 4 ;							/*  page1前面			*/
	reverse( -1,_para.disp+D0_0-1 ) ;			/*  表示ﾍﾟｰｼﾞ設定		*/
	reverse( _para.zx1+P1_X1-1,-1 ) ;			/*  page1のX倍率解除	*/
	reverse( _para.zy1+P1_Y1-1,-1 ) ;			/*  page1のY倍率解除	*/
	_para.zx1 = _screen[sel-1].zx ;
	_para.zy1 = _screen[sel-1].zy ;
	reverse( -1,_para.zx1+P1_X1-1 ) ;			/*  page1のX倍率設定	*/
	reverse( -1,_para.zy1+P1_Y1-1 ) ;			/*  page1のY倍率設定	*/
	_para.p1 = sel ;							/*  page1の画面ﾓｰﾄﾞ		*/
	return 0 ;
}

int select_disp( int sel )
{
	sel -= ( D0_0 - 1 ) ;
	if ( _para.p0 >= 12 && sel != 1 ) return 1 ;	/*  1画面ﾓｰﾄﾞ		*/
	reverse( _para.disp+D0_0-1,-1 ) ;			/*  表示ﾍﾟｰｼﾞ解除		*/
	_para.disp = sel ;							/*  表示ﾍﾟｰｼﾞ選択		*/
	return 0 ;
}

int select_zoom( int sel )
{
	if ( sel < P0_Y1 ) {						/*  page0 X				*/
		sel -= ( P0_X1 - 1 ) ;
		if ( _para.p0 >= 0 ) {					/*  MS-DOS以外			*/
			if ( sel < _screen[_para.p0-1].zx ) return 1 ;
		}
		reverse( _para.zx0+P0_X1-1,-1 ) ;
		_para.zx0 = sel ;
	} else if ( sel < P1_X1 ) {					/*  page0 Y				*/
		sel -= ( P0_Y1 - 1 ) ;
		if ( _para.p0 >= 0 ) {					/*  MS-DOS以外			*/
			if ( sel < _screen[_para.p0-1].zy ) return 1 ;
		}
		reverse( _para.zy0+P0_Y1-1,-1 ) ;
		_para.zy0 = sel ;
	} else if ( sel < P1_Y1 ) {					/*  page1 X				*/
		if ( _para.p0 >= 12 ) return 1 ;		/*  1画面ﾓｰﾄﾞ			*/
		sel -= ( P1_X1 - 1 ) ;
		if ( _para.p0 >= 0 ) {					/*  MS-DOS以外			*/
			if ( sel < _screen[_para.p1-1].zx ) return 1 ;
		}
		reverse( _para.zx1+P1_X1-1,-1 ) ;
		_para.zx1 = sel ;
	} else {									/*  page1 Y				*/
		if ( _para.p0 >= 12 ) return 1 ;		/*  1画面ﾓｰﾄﾞ			*/
		sel -= ( P1_Y1 - 1 ) ;
		if ( _para.p0 >= 0 ) {					/*  MS-DOS以外			*/
			if ( sel < _screen[_para.p1-1].zy ) return 1 ;
		}
		reverse( _para.zy1+P1_Y1-1,-1 ) ;
		_para.zy1 = sel ;
	}
	return 0 ;
}

void select_on( int old,int new )
{
	int		ret ;

	if ( new <= SEL_TIT || new >= SEL_MAX ) return ;
	reverse( old,-1 ) ;							/*  ｶﾚﾝﾄ位置表示解除	*/
	EGB_color( Gwork,C_PAINT,C_HLBLUE ) ;		/*  面塗り色			*/
	if ( new == SEL_DOS ) {						/*  MS-DOS				*/
		ret = select_msdos() ;
	} else if ( new < P1_1 ) {					/*  page0のﾓｰﾄﾞ			*/
		ret = select_page0( new ) ;
	} else if ( new < D0_0 ) {					/*  page1のﾓｰﾄﾞ			*/
		ret = select_page1( new ) ;
	} else if ( new < P0_X1 ) {					/*  表示画面			*/
		ret = select_disp( new ) ;
	} else {									/*  表示拡大			*/
		ret = select_zoom( new ) ;
	}
	if ( !ret ) reverse( -1,new ) ;				/*  選択OK!				*/
	EGB_color( Gwork,C_PAINT,C_WHITE ) ;		/*  面塗り色			*/
	reverse( -1,new ) ;							/*  ｶﾚﾝﾄ位置表示設定	*/
}

int select( void )
{
	int		mbot, mx, my ;
	int		cnt, sel=-1 ;

	MOS_disp( TRUE ) ;							/*  ﾏｳｽ表示				*/
	EGB_paintMode( Gwork,0x20 ) ;				/*  面塗り				*/
	EGB_writeMode( Gwork,M_XOR ) ;				/*  XOR描画				*/
	EGB_color( Gwork,C_PAINT,C_WHITE ) ;		/*  面塗り色			*/
	mosBreak() ;								/*  ﾏｳｽ開放待ち			*/
	while ( TRUE ) {
		MOS_rdpos( &mbot,&mx,&my ) ;			/*  ﾏｳｽ情報取得			*/
		for ( cnt=P0_1; cnt<SEL_MAX; cnt++ ) {
			if ( _dpara[cnt].xs > mx || _dpara[cnt].xe < mx ) continue ;
			if ( _dpara[cnt].ys > my || _dpara[cnt].ye < my ) continue ;
			break ;
		}
		if ( cnt >= SEL_MAX ) cnt = -1 ;
		if ( mbot == MOS_RIGHT && cnt == SEL_TIF ) {	/*  仮想画面	*/
			reverse( sel,cnt ) ;
			savesize( TRUE ) ;
			break ;
		}
		if ( mbot == MOS_LEFT && cnt > SEL_TIT ) {	/*  ﾏｳｽ左ｸﾘｯｸ		*/
			if ( cnt == SEL_EXEC || cnt == SEL_END || cnt == SEL_TIF ) {
				reverse( sel,cnt ) ;
				if ( cnt == SEL_TIF ) savesize( FALSE ) ;
				break ;
			}
			select_on( sel,cnt ) ;
			mosBreak() ;						/*  ﾏｳｽ開放待ち			*/
		} else if ( sel != cnt ) {
			reverse( sel,cnt ) ;
		}
		sel = cnt ;
	}
	EGB_displayPage( Gwork,0,0 ) ;				/*  画面非表示			*/
	mosBreak() ;								/*  ﾏｳｽ開放待ち			*/
	MOS_disp( FALSE ) ;							/*  ﾏｳｽ非表示			*/
	return cnt ;
}

void setdos( void )
{
	int		cnt, off ;
	int		zx0, zy0, zx1, zy1 ;

	for ( cnt=0; cnt<32; cnt++ ) _crtc[cnt] = _crtc_dos[cnt] ;
	zx0 = _para.zx0 == 3 ? 3 : (_para.zx0-1) ;
	zy0 = _para.zy0 == 3 ? 3 : (_para.zy0-1) ;
	zx1 = _para.zx1 == 3 ? 3 : (_para.zx1-1) ;
	zy1 = _para.zy1 == 3 ? 3 : (_para.zy1-1) ;
	_crtc[0x1B] = (zy1<<12) + (zx1<<8) + (zy0<< 4) + zx0 ;

	outp( 0x440,0x1C ) ;						/*  CR0					*/
	outp( 0x443,0 ) ;							/*  CRTC stop			*/
	while ( inp( 0x443 ) & 0x80 ) ;				/*  busy check			*/

	for ( cnt=0; cnt<32; cnt++ ) {				/*  CRTC内部ﾚｼﾞｽﾀ		*/
		crtc_out( cnt ) ;
	}
	outp( 0x440,0x1C ) ;						/*  CR0					*/
	outp( 0x443,((_crtc[0x1C] >> 8) | 0x80) ) ;	/*  CRTC start			*/

	outp( 0x448,1 ) ;							/*  ﾌﾟﾗｲｵﾘﾃｨﾚｼﾞｽﾀ		*/
	outp( 0x44A,0x29 ) ;						/*  ﾚｲﾔ1:16色ﾊﾟﾚｯﾄ		*/
	for ( cnt=0; cnt<16; cnt++ ) {
		outp( 0xFD90,cnt ) ;					/*  palette no.			*/
		outp( 0xFD92,_pal161.pal[cnt].b ) ;		/*  Blue				*/
		outp( 0xFD94,_pal161.pal[cnt].r ) ;		/*  Red					*/
		outp( 0xFD96,_pal161.pal[cnt].g ) ;		/*  Green				*/
	}

	outp( 0x448,1 ) ;							/*  ﾌﾟﾗｲｵﾘﾃｨﾚｼﾞｽﾀ		*/
	outp( 0x44A,0x09 ) ;						/*  ﾚｲﾔ0:16色ﾊﾟﾚｯﾄ		*/
	for ( cnt=0; cnt<16; cnt++ ) {
		outp( 0xFD90,cnt ) ;					/*  palette no.			*/
		outp( 0xFD92,_pal160.pal[cnt].b ) ;		/*  Blue				*/
		outp( 0xFD94,_pal160.pal[cnt].r ) ;		/*  Red					*/
		outp( 0xFD96,_pal160.pal[cnt].g ) ;		/*  Green				*/
	}

	outp( 0x448,1 ) ;							/*  ﾌﾟﾗｲｵﾘﾃｨﾚｼﾞｽﾀ		*/
#if 0
	outp( 0x44A,_vdc[1] ) ;
#endif

	for ( cnt=0; cnt<TMP_SIZE; cnt++ ) _tmp[cnt] = 0 ;
	switch ( _para.disp ) {						/*  表示ﾍﾟｰｼﾞ			*/
	case 1:	outp( 0x44A,0x09 ) ;				/*  page0のみ表示		*/
			for ( cnt=256, off=VRAM_HALF; cnt<512; cnt++, off+=TMP_SIZE ) {
				movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
			}
			break ;
	case 2:	outp( 0x44A,0x20 ) ;				/*  page1のみ表示		*/
			for ( cnt=0, off=0; cnt<256; cnt++, off+=TMP_SIZE ) {
				movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
			}
			break ;
	case 3:	outp( 0x44A,0x20 ) ;				/*  page0前面表示		*/
			break ;
	case 4:	outp( 0x44A,0x09 ) ;				/*  page1前面表示		*/
			break ;
	}
	outp( 0xFDA0,0x0A ) ;						/*  page0&1表示			*/
}

void setdisp( void )
{
	int		zx0, zy0, zx1, zy1 ;

	_para.sx0 = _para.sy0 = _para.sx1 = _para.sy1 = 0 ;
	_para.vx0 = _para.vy0 = _para.vx1 = _para.vy1 = 0 ;
	if ( _para.p0 < 0 ) {						/*  MS-DOS				*/
		setdos() ;
		return ;
	}
	EGB_resolution( Gwork,0,_para.p0 ) ;		/*  page0				*/
	EGB_resolution( Gwork,1,_para.p1 ) ;		/*  page1				*/
	zx0 = _para.zx0 == 3 ? 4 : _para.zx0 ;
	zy0 = _para.zy0 == 3 ? 4 : _para.zy0 ;
	EGB_writePage( Gwork,0 ) ;					/*  page0を処理開始		*/
	if ( _para.p0 >= 12 && _para.p0 <= 14 ) {	/*  256色				*/
		EGB_palette( Gwork,0,(char *)&_pal256 ) ;
	} else if ( _para.p0 >= 1 && _para.p0 <= 4 ) {	/*  16色			*/
		EGB_palette( Gwork,0,(char *)&_pal160 ) ;
	}
	EGB_displayStart( Gwork,2,zx0,zy0 ) ;		/*  画面の拡大			*/
	EGB_displayStart( Gwork,0,0,0 ) ;			/*  表示開始位置		*/
	EGB_displayStart( Gwork,1,0,0 ) ;			/*  仮想画面開始位置	*/
	EGB_displayStart( Gwork,3,_sx0,_sy0 ) ;		/*  表示画面の大きさ	*/
	if ( _para.p0 < 12 ) {						/*  2画面ﾓｰﾄﾞ			*/
		zx1 = _para.zx1 == 3 ? 4 : _para.zx1 ;
		zy1 = _para.zy1 == 3 ? 4 : _para.zy1 ;
		EGB_writePage( Gwork,1 ) ;				/*  page1を処理開始		*/
		if ( _para.p1 >= 1 && _para.p1 <= 4 ) {	/*  16色				*/
			EGB_palette( Gwork,0,(char *)&_pal161 ) ;
		}
		EGB_displayStart( Gwork,2,zx1,zy1 ) ;	/*  画面の拡大			*/
		EGB_displayStart( Gwork,0,0,0 ) ;		/*  表示開始位置		*/
		EGB_displayStart( Gwork,1,0,0 ) ;		/*  仮想画面開始位置	*/
		EGB_displayStart( Gwork,3,_sx1,_sy1 ) ;	/*  表示画面の大きさ	*/
	}

	switch ( _para.disp ) {
	case 1:										/*  page0のみ表示		*/
			if ( _para.p0 < 12 ) {				/*  2画面ﾓｰﾄﾞ			*/
				EGB_writePage( Gwork,1 ) ;		/*  page1を処理開始		*/
				EGB_paintMode( Gwork,0x20 ) ;	/*  面塗り				*/
				EGB_writeMode( Gwork,M_PSET ) ;	/*  PSET描画			*/
				if ( _para.p1 >= 1 && _para.p1 <= 4 ) {	/*  16色		*/
					EGB_color( Gwork,C_BACK,C_BLACK ) ;	/*  背景色		*/
				} else {						/*  32K色				*/
					EGB_color( Gwork,C_BACK,0x8000 ) ;	/*  背景色		*/
				}
				EGB_clearScreen( Gwork ) ;		/*  前画面ｸﾘｱ			*/
				EGB_displayPage( Gwork,1,3 ) ;	/*  page1前面表示		*/
			} else {							/*  1画面ﾓｰﾄﾞ			*/
				EGB_displayPage( Gwork,0,1 ) ;	/*  page0のみ表示		*/
			}
			break ;
	case 2:										/*  page1のみ表示		*/
			EGB_writePage( Gwork,0 ) ;			/*  page0を処理開始		*/
			EGB_paintMode( Gwork,0x20 ) ;		/*  面塗り				*/
			EGB_writeMode( Gwork,M_PSET ) ;		/*  PSET描画			*/
			if ( _para.p0 >= 1 && _para.p0 <= 4 ) {		/*  16色		*/
				EGB_color( Gwork,C_BACK,C_BLACK ) ;		/*  背景色		*/
			} else {							/*  32K色				*/
				EGB_color( Gwork,C_BACK,0x8000 ) ;		/*  背景色		*/
			}
			EGB_clearScreen( Gwork ) ;			/*  前画面ｸﾘｱ			*/
			EGB_displayPage( Gwork,0,3 ) ;		/*  page0前面表示		*/
			break ;
	case 3:	EGB_displayPage( Gwork,0,3 ) ;		/*  page0前面表示		*/
			break ;
	case 4:	EGB_displayPage( Gwork,1,3 ) ;		/*  page1前面表示		*/
			break ;
	}
}

void menu( void )
{
	int		cnt ;

	MOS_disp( FALSE ) ;							/*  ﾏｳｽ非表示			*/
	ginit() ;									/*  EGB初期化			*/
	EGB_color( Gwork,C_FRONT,C_HYELLOW ) ;		/*  文字色				*/
	glocate( _dpara[SEL_TIT].xs,_dpara[SEL_TIT].ys+15 ) ;
	gputs( _msg[0] ) ;
	glocate( _dpara[SEL_EXEC].xs,_dpara[SEL_EXEC].ys+15 ) ;
	gputs( _msg[19] ) ;
	EGB_color( Gwork,C_FRONT,C_HWHITE ) ;		/*  文字色				*/
	for ( cnt=1; cnt<19; cnt++ ) {
		glocate( _dpara[cnt].xs,_dpara[cnt].ys+15 ) ;
		gputs( _msg[cnt] ) ;
	}
	EGB_paintMode( Gwork,0x20 ) ;				/*  面塗り				*/
	EGB_writeMode( Gwork,M_XOR ) ;				/*  XOR描画				*/
	EGB_color( Gwork,C_PAINT,C_HLBLUE ) ;		/*  面塗り色			*/

	if ( _para.p0 < 0 ) {						/*  MS-DOS				*/
		reverse( -1,SEL_DOS ) ;					/*  MS-DOS画面			*/
	} else {
		reverse( -1,_para.p0 ) ;				/*  page0の画面ﾓｰﾄﾞ		*/
		if ( _para.p0 < 12 ) {					/*  2画面ﾓｰﾄﾞ			*/
			reverse( -1,_para.p1+P1_1-1 ) ;		/*  page1の画面ﾓｰﾄﾞ		*/
		}
	}
	reverse( -1,_para.disp+D0_0-1 ) ;			/*	表示ﾍﾟｰｼﾞ			*/
	reverse( -1,_para.zx0+P0_X1-1 ) ;			/*  page0のX倍率		*/
	reverse( -1,_para.zy0+P0_Y1-1 ) ;			/*  page0のY倍率		*/
	if ( _para.p0 < 12 ) {						/*  2画面ﾓｰﾄﾞ			*/
		reverse( -1,_para.zx1+P1_X1-1 ) ;		/*  page1のX倍率		*/
		reverse( -1,_para.zy1+P1_Y1-1 ) ;		/*  page1のY倍率		*/
	}
}

void move_disp( int status )
{
	int		zm ;

	if ( !(status & PAD_A) ) {					/*  A on (page1)		*/
		if ( _para.p0 >= 12 ) return ;			/*  1画面ﾓｰﾄﾞ			*/
		if ( _tim1 < 1 ) return ;
		if ( !(status & PAD_RIGHT) )	_para.vx1++ ;
		if ( !(status & PAD_LEFT) )		_para.vx1-- ;
		if ( !(status & PAD_DOWN) )		_para.vy1++ ;
		if ( !(status & PAD_UP) )		_para.vy1-- ;
		_tim1 = 0 ;
		if ( _para.p0 < 0 ) {					/*  MS-DOS画面			*/
												/*  ﾃｷｽﾄ画面 1024*512	*/
			outp( 0x440,0x15 ) ;				/*  FA1					*/
			outpw( 0x442,_para.vx1/2+_para.vy1*_crtc[0x18] ) ;
			zm = _para.zx1 == 3 ? 4 : _para.zx1 ;
			outp( 0x440,0x16 ) ;				/*  HAJ1				*/
			outpw( 0x442,_crtc[0x0B]-zm*(_para.vx1&0x01) ) ;
			return ;
		}
		EGB_writePage( Gwork,1 ) ;				/*  page1描画			*/
		if ( EGB_displayStart( Gwork,1,_para.vx1,_para.vy1 ) ) {
			if ( !(status & PAD_RIGHT) )	--_para.vx1 ;
			if ( !(status & PAD_LEFT) )		++_para.vx1 ;
			if ( !(status & PAD_DOWN) )		--_para.vy1 ;
			if ( !(status & PAD_UP) )		++_para.vy1 ;
		}
	} else {									/*  A/B off (page0)		*/
		if ( _tim0 < 1 ) return ;
		if ( !(status & PAD_RIGHT) )	_para.vx0++ ;
		if ( !(status & PAD_LEFT) )		_para.vx0-- ;
		if ( !(status & PAD_DOWN) )		_para.vy0++ ;
		if ( !(status & PAD_UP) )		_para.vy0-- ;
		_tim0 = 0 ;
		if ( _para.p0 < 0 ) {					/*  MS-DOS画面			*/
												/*  ｸﾞﾗﾌｨｯｸ画面 640*819	*/
			outp( 0x440,0x11 ) ;				/*  FA0					*/
			outpw( 0x442,_para.vx0/2+_para.vy0*_crtc[0x14] ) ;
			zm = _para.zx0 == 3 ? 4 : _para.zx0 ;
			outp( 0x440,0x12 ) ;				/*  HAJ0				*/
			outpw( 0x442,_crtc[0x09]-zm*(_para.vx0&0x01) ) ;
			return ;
		}
		EGB_writePage( Gwork,0 ) ;				/*  page0描画			*/
		if ( EGB_displayStart( Gwork,1,_para.vx0,_para.vy0 ) ) {
			if ( !(status & PAD_RIGHT) )	--_para.vx0 ;
			if ( !(status & PAD_LEFT) )		++_para.vx0 ;
			if ( !(status & PAD_DOWN) )		--_para.vy0 ;
			if ( !(status & PAD_UP) )		++_para.vy0 ;
		}
	}
}

void start_disp( int status )
{
	if ( !(status & PAD_A) ) {					/*  A on (page1)		*/
		if ( _para.p0 >= 12 ) return ;			/*  1画面ﾓｰﾄﾞ			*/
		if ( _tim1 < 1 ) return ;
		if ( !(status & PAD_RIGHT) )	_para.sx1++ ;
		if ( !(status & PAD_LEFT) )		_para.sx1-- ;
		if ( !(status & PAD_DOWN) )		_para.sy1++ ;
		if ( !(status & PAD_UP) )		_para.sy1-- ;
		_tim1 = 0 ;
		if ( _para.p0 < 0 ) {					/*  MS-DOS画面			*/
			return ;
		}
		EGB_writePage( Gwork,1 ) ;				/*  page1描画			*/
		if ( EGB_displayStart( Gwork,0,_para.sx1,_para.sy1 ) ) {
			if ( !(status & PAD_RIGHT) )	--_para.sx1 ;
			if ( !(status & PAD_LEFT) )		++_para.sx1 ;
			if ( !(status & PAD_DOWN) )		--_para.sy1 ;
			if ( !(status & PAD_UP) )		++_para.sy1 ;
		}
	} else {									/*  A/B off (page0)		*/
		if ( _tim0 < 1 ) return ;
		if ( !(status & PAD_RIGHT) )	_para.sx0++ ;
		if ( !(status & PAD_LEFT) )		_para.sx0-- ;
		if ( !(status & PAD_DOWN) )		_para.sy0++ ;
		if ( !(status & PAD_UP) )		_para.sy0-- ;
		_tim0 = 0 ;
		if ( _para.p0 < 0 ) {					/*  MS-DOS画面			*/
			return ;
		}
		EGB_writePage( Gwork,0 ) ;				/*  page0描画			*/
		if ( EGB_displayStart( Gwork,0,_para.sx0,_para.sy0 ) ) {
			if ( !(status & PAD_RIGHT) )	--_para.sx0 ;
			if ( !(status & PAD_LEFT) )		++_para.sx0 ;
			if ( !(status & PAD_DOWN) )		--_para.sy0 ;
			if ( !(status & PAD_UP) )		++_para.sy0 ;
		}
	}
}

void reset_disp( void )
{
	_para.sx0 = _para.sy0 = _para.sx1 = _para.sy1 = 0 ;
	_para.vx0 = _para.vy0 = _para.vx1 = _para.vy1 = 0 ;
	if ( _para.p0 < 0 ) {						/*  MS-DOS画面			*/
		_crtc[0x11] = _crtc_dos[0x11] ;
		crtc_out( 0x11 ) ;						/*  page0ﾌﾚｰﾑ先頭(FA0)	*/
		_crtc[0x12] = _crtc_dos[0x12] ;
		crtc_out( 0x12 ) ;						/*  水平ｱｼﾞｬｽﾄ(HAJ0)	*/
		_crtc[0x15] = _crtc_dos[0x15] ;
		crtc_out( 0x15 ) ;						/*  page1ﾌﾚｰﾑ先頭(FA1)	*/
		_crtc[0x16] = _crtc_dos[0x16] ;
		crtc_out( 0x16 ) ;						/*  水平ｱｼﾞｬｽﾄ(HAJ1)	*/
		return ;
	} else if ( _para.p0 < 12 ) {				/*  2画面ﾓｰﾄﾞ			*/
		EGB_writePage( Gwork,1 ) ;				/*  page1描画			*/
		EGB_displayStart( Gwork,0,_para.sx1,_para.sy1 ) ;
		EGB_displayStart( Gwork,1,_para.vx1,_para.vy1 ) ;
	}
	EGB_writePage( Gwork,0 ) ;					/*  page0描画			*/
	EGB_displayStart( Gwork,0,_para.sx0,_para.sy0 ) ;
	EGB_displayStart( Gwork,1,_para.vx0,_para.vy0 ) ;
}

void mos_action( void )
{
	int		mbot, mx, my ;
	int		status, status2;

	SND_joy_out( 0x0F,&status,&status2 );		/*  誤動作防止		*/
	while ( TRUE ) {
		MOS_rdpos( &mbot,&mx,&my ) ;			/*  ﾏｳｽ情報取得			*/
		if ( mbot == MOS_RIGHT ) return ;		/*  右ｸﾘｯｸ				*/
		if ( mbot == MOS_LEFT ) {				/*  左ｸﾘｯｸ (reset)		*/
			reset_disp() ;						/*  表示ﾘｾｯﾄ			*/
			continue ;
		}
		if ( SND_joy_in_2( 0,&status ) ) continue ;
		status &= 0x000000FF;
		if ( (status & 0xFF ) == 0xFF ) continue ;
		if ( !(status & PAD_SELECT) ) return ;	/*  SELECT on (menu)	*/
		if ( !(status & PAD_START) ) {			/*  RUN on (reset)		*/
			reset_disp() ;						/*  表示ﾘｾｯﾄ			*/
			continue ;
		}
		if ( (status & PAD_MOVE) == PAD_MOVE ) continue ;
		if ( !(status & PAD_B) ) {				/*  B on (reset)		*/
			start_disp( status ) ;				/*  表示開始位置変更	*/
		} else {
			move_disp( status ) ;				/*  仮想画面中の移動	*/
		}
	}
}

void disp( void )
{
	int		sel, page ;

	while ( TRUE ) {
		menu() ;								/*  初期画面表示		*/
		if ( (sel=select()) == SEL_END ) break ;	/*  ﾒﾆｭｰ選択		*/
		to_vram() ;								/*  VRAMへﾃﾞｰﾀ転送		*/
		page = _para.disp ;
		if ( sel == SEL_TIF && _para.disp > 2 ) _para.disp -= 2 ;
		setdisp() ;								/*  画面設定			*/
		if ( sel == SEL_TIF ) {
			tiff_save() ;						/*  TIFF保存			*/
			_para.disp = page ;
		} else {
			mos_action() ;						/*  ﾏｳｽ操作				*/
		}
	} ;
	mosBreak() ;								/*  ﾏｳｽ開放待ち			*/
	EGB_resolution( Gwork,0,12 ) ;				/*  page0:256,1画面ﾓｰﾄﾞ	*/
	EGB_resolution( Gwork,1,12 ) ;				/*  page1:error			*/
	EGB_writePage( Gwork,0 ) ;					/*  page0描画			*/
	EGB_paintMode( Gwork,0x20 ) ;				/*  面塗り				*/
	EGB_writeMode( Gwork,M_PSET ) ;				/*  PSET描画			*/
	EGB_color( Gwork,C_BACK,C_BLACK ) ;			/*  背景色				*/
	EGB_clearScreen( Gwork ) ;					/*  画面ｸﾘｱ				*/
}

int getpal( void )
{
	int		cnt ;

	_pal256.npal = (_DWORD)256 ;
	for ( cnt=0; cnt<256; cnt++ ) {
		_pal256.pal[cnt].no = (_DWORD)cnt ;
		if ( fread( &_pal256.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
		if ( fread( &_pal256.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
		if ( fread( &_pal256.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
		_pal256.pal[cnt].zero = (_BYTE)0 ;
	}
	_pal160.npal = (_DWORD)16 ;
	for ( cnt=0; cnt<16; cnt++ ) {
		_pal160.pal[cnt].no = (_DWORD)cnt ;
		if ( fread( &_pal160.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
		if ( fread( &_pal160.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
		if ( fread( &_pal160.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
		_pal160.pal[cnt].zero = (_BYTE)0 ;
	}
	_pal161.npal = (_DWORD)16 ;
	for ( cnt=0; cnt<16; cnt++ ) {
		_pal161.pal[cnt].no = (_DWORD)cnt ;
		if ( fread( &_pal161.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
		if ( fread( &_pal161.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
		if ( fread( &_pal161.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
		_pal161.pal[cnt].zero = (_BYTE)0 ;
	}
	if ( _para.buf != NULL ) {
		if ( fread( _para.buf,1,VRAM_SIZE,_para.fp ) != VRAM_SIZE ) return 1 ;
	}
	return 0 ;
}

void errWait( void )
{
	locate( 2,6 ) ;								/*  2桁,6行目			*/
	gputs( "マウスをクリックして下さい." ) ;
	while ( mosButton() == MOS_NONE ) ;			/*  ﾏｳｽｸﾘｯｸを待つ		*/
	mosBreak() ;								/*  ﾏｳｽ開放待ち			*/
}

void usage( void )
{
	locate( 2,4 ) ;								/*  2桁,4行目			*/
	gputs( "Usage:  PVD  ﾌｧｲﾙ名.PVS" ) ;
	errWait() ;
	MOS_end() ;									/*  MOS終了処理			*/
	exit( EXIT_FAILURE ) ;
}

void openError( char *fname )
{
	locate( 2,4 ) ;								/*  2桁,4行目			*/
	gprintf( "file <%s> open error.",fname ) ;
	errWait() ;
	MOS_end() ;									/*  MOS終了処理			*/
	exit( EXIT_FAILURE ) ;
}

int main( int ac,char *av[] )
{
	ginit() ;									/*  EGB初期化			*/
	minit() ;									/*  MOS初期化			*/
	locate( 2,2 ) ;								/*  2桁,2行目			*/
	gputs( "PVD  Version 0.70  (C)パオパオ 1994." ) ;
	if ( ac < 2 ) usage() ;
	_harderr_retry() ;							/*  致命的ｴﾗｰ自動回避	*/
	if ( (_para.fp=fopen( av[1],"rb" )) == NULL ) openError( av[1] ) ;
	_para.fname = av[1] ;						/*  ﾌｧｲﾙ名				*/
	_para.buf = (char *)malloc( VRAM_SIZE ) ;	/*  512KB				*/
	if ( _para.buf != NULL ) {					/*  ﾒﾓﾘ確保OK!			*/
		locate( 16,15 ) ;						/*  16桁,15行目			*/
		gputs( "ファイルを読んでいますので、しばらくお待ち下さい." ) ;
	}
	if ( !getpal() ) {							/*  ﾊﾟﾚｯﾄ読み込み		*/
		TIM_TIME timer ;
		unsigned timeno ;
		timer.mode = 0 ;
		timer.inf = 0 ;
		BSETCODEADR( (char *)&timer.adr,int_handler ) ;
		timer.hcycle = 0x00 ;
		timer.lcycle = 1 ;						/*  10ms	 			*/
		TIM_settime( &timer, (int *)&timeno ) ;
		disp() ;								/*  ﾃﾞｰﾀ表示			*/
		TIM_clrtime( timeno ) ;
	} else {
		locate( 16,15 ) ;						/*  16桁,15行目			*/
		gputs( "                                                 " ) ;
		locate( 2,4 ) ;							/*  2桁,4行目			*/
		gprintf( "file <%s> read error. ( .PVS ファイルですか？ )",av[1] ) ;
		errWait() ;
	}
	if ( _para.buf != NULL ) free( _para.buf ) ;
	fclose( _para.fp ) ;
	MOS_end() ;									/*  MOS終了処理			*/
	return 0 ;
}

/*	HISTORY
-----------------------------------------------------------------------------
*	1994.01.03 : CREATE
*	1994.01.10 : ﾊﾟｯﾄﾞ操作で画面ｽｸﾛｰﾙ,表示位置変更をできるようにした.
*	1994.01.13 : TIFF保存できるようにした.
---------------------------------------------------------------------------*/
