/*			VIDEO RECORDER

			Hiroshi TODA
			1991 7/28

*/

#include <stdio.h>
#include <stdlib.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "video.h"

#define C_WT 0x7fff		/* カーソル color */
#define C_PL 24311		/* 初期プレーン color */
#define C_FL 0x303030		/* files back color */
#define C_COLOR 15		/* Command color palette */
#define W_COLOR 8		/* Window color palette */
#define B_COLOR 7		/* Back color palette */
#define E_COLOR 10		/* ERROR color palette */
#define OK_COLOR 12		/* OK color palette */
#define POLYMAX 1024		/* Polygon point max */
#define S1_COLOR 4		/* SCALE1 color palette */
#define S2_COLOR 12		/* SCALE2 color palette */

extern int mov_save( char *name ); /* mov data save */
extern int mov_head_read( char *namemov, int svar[] ); /* read total,page */
extern int mov_file_set( char *name, char *namemov ); /* name → name.mov */

extern int mov_sound_save( char *namemov );

int sw = 0,cx = 0,cy = 0;	/* MOUSE data */
int pn = 0;			/* POLYGON point counter */
short int poly[POLYMAX+2][2];	/* POLYGON point data */

int col[][4] = {	{0,0,0,0},		/* paint & load  color data*/
			{0,0,0,0}
		};
int lvar[] = { 320,240,512,0,256,0,0,0 ,0, 1 };			/* var. */
int svar[] = { 0,0,0,0,0,0,319,239,0,0,0,1,28 };
int epvar[] = { 2,1,0,0,0,0 }; /* page1,page2,color,svar-address,pn,fname */
int ecvar[10][2] = { {0,0},
		     {319,239},
		     {-1,-1},
		     {-1,-1},
		     {-1,-1},
		     {-1,-1},
		     {-1,-1},
		     {-1,-1},
		     {-1,-1},
		     {-1,-1}
		   };

char path2[80];		/* PATH NAME2 */
char fullname2[80];	/* PATH + FILES NAME2 */

int mpara[3];		/* mouse para */
char para[256];		/* PARAM */
char gwork[1024];	/* graph work */
char swork[16384];	/* SND work */
char ework[1536];	/* EGB work */
char mwork[4096];	/* MOUSE work */
char bbuf[524288];	/* BACK-UP buf. */
char rbuf[245760];	/* RAM-DISK buf. */
char rbuf2[262144];	/* RAM-DISK buf. */

void ini()
{
	SND_init(swork);			/* sound ini */
	SND_elevol_init();
	SND_elevol_mute(3);
	DWORD(para+0) = 0x1b80;			/* console ini */
	console(gwork,para);
	EGB_init(ework,1536);			/* graph ini */
	EGB_resolution(ework,0,10);		/* モード10,3合成 */
	EGB_resolution(ework,1,3);
	EGB_writePage(ework,0);			/* mode10設定 */
	EGB_displayStart(ework,2,2,2);
	EGB_displayStart(ework,3,320,240);
	EGB_color(ework,0,C_PL);		/* clear paint */
	EGB_color(ework,2,C_PL);
	EGB_paintMode(ework,0x22);
	EGB_writeMode(ework,0);
	EGB_penSize(ework,1);
	WORD(para+0) = 0;
	WORD(para+2) = 0;
	WORD(para+4) = 319;
	WORD(para+6) = 239;
	EGB_rectangle(ework,para);
	EGB_writePage(ework,1);			/* mode3に書き込み */
	EGB_displayPage(ework,1,3);		/* mode3が前側 */
	MOS_start(mwork,4096);			/* mouse ini */
	MOS_resolution(0,10);
	MOS_resolution(1,3);
	MOS_writePage(1);
	MOS_horizon(0,639);
	MOS_vertical(0,479);
	MOS_disp(0);
	MOS_setpos( 320, 240 );
	DWORD(para+0) = 0;			/* key ini */
	keyin(gwork,para);
	DWORD(para+0) = 0x0200;			/* ASCII code */
	DWORD(para+4) = 0;
	DWORD(para+8) = 0;
	DWORD(para+12) = 0;
	keyin(gwork,para);
	DWORD(para+0) = 1;			/* files背景色 */
	DWORD(para+4) = 7;
	DWORD(para+8) = C_FL;
	EGB_palette(ework,1,para);
}

void end()
{
	MOS_end();
	EGB_init(ework,1536);
	DWORD(para+0) = 0;
	SND_elevol_mute(0);		/* sound off */
	SND_end();
	keyin(gwork,para);
}

windget()
{
	EGB_writePage(ework,1);		/* mode3に書き込み */
	EGB_clearScreen(ework);
	EGB_textZoom(ework,0,8,16);
	EGB_textZoom(ework,1,16,16);
	EGB_writeMode(ework,0);
	EGB_color(ework,0,W_COLOR);	/* Window paint */
	EGB_color(ework,2,W_COLOR);
	EGB_paintMode(ework,0x22);
	EGB_writeMode(ework,0);
	WORD(para+0) = 0;
	WORD(para+2) = 448;
	WORD(para+4) = 639;
	WORD(para+6) = 479;
	EGB_rectangle(ework,para);
	EGB_color(ework,0,C_COLOR);
	EGB_displayPage(ework,1,3);		/* mode3が前側 */
	return 0;
}

windput()
{
	EGB_clearScreen(ework);
	EGB_displayPage(ework,1,1);		/* mode10のみ表示 */
	return 0;
}

display_scale()
{
	int i;
	char para[10];

	EGB_writePage(ework,1);		/* mode3に書き込み */
	EGB_clearScreen(ework);
	EGB_writeMode(ework,0);
	for( i=20 ; i<639 ; i = i+20 ){
		if( i % 200 )EGB_color(ework,0,S1_COLOR);
		else EGB_color(ework,0,S2_COLOR);
		WORD(para + 0) = 2;
		WORD(para + 2) = i;
		WORD(para + 4) = 0;
		WORD(para + 6) = i;
		WORD(para + 8) = 479;
		EGB_unConnect(ework,para);
	}
	for( i=20 ; i<479 ; i = i+20 ){
		if( i % 200 )EGB_color(ework,0,S1_COLOR);
		else EGB_color(ework,0,S2_COLOR);
		WORD(para + 0) = 2;
		WORD(para + 2) = 0;
		WORD(para + 4) = i;
		WORD(para + 6) = 639;
		WORD(para + 8) = i;
		EGB_unConnect(ework,para);
	}
	EGB_displayPage(ework,1,3);	/* mode10,3表示 */
	return 0;
}

/* mpara[0]-[2] = back data( sw, cx, cy ) */

mouse(mpara,xd,yd,mmd)		/* mouse */
int mpara[];
int xd,yd,mmd;
{
	int x,y,cx0,cy0,mdsp,dspmode,backmode,dummy;

	EGB_color(ework,0,C_WT);
	EGB_paintMode(ework,0x2);
	EGB_writeMode(ework,4);
	cx0 = -1; cy0 = -1; mdsp = 1; dummy = -1;
	backmode = mmd & 1;
	dspmode = mmd >> 1;
	if( mdsp ){
		MOS_rdpos(&sw,&cx0,&cy0);
		if( dspmode )mousesub(dspmode,cx,cy,cx0,cy0,xd,yd);
	}	
mouse1:	MOS_rdpos(&sw,&x,&y);
	if( sw )goto mouse2;
	if( (cx0 == x) && (cy0  == y) )goto mouse1;
	if( mdsp == 0 ){
		cx0 = x;
		cy0 = y;
	}
	if( dspmode )mousesub(dspmode,cx,cy,cx0,cy0,xd,yd);
	mdsp = mdsp ^ 1;
	goto mouse1;
mouse2:	if( mdsp && dspmode )mousesub(dspmode,cx,cy,cx0,cy0,xd,yd);
	cx = x;
	cy = y;
	if( backmode )goto mouse3;
	while( dummy ){
		MOS_rdpos(&dummy,&x,&y);
	}
mouse3:	EGB_color(ework,0,C_COLOR);
	mpara[0] = sw;
	mpara[1] = cx;
	mpara[2] = cy;
	return 0;
}

mousesub(dspmode,cx,cy,cx0,cy0,xd,yd)		/* 特殊カーソル表示 */
int dspmode,cx,cy,cx0,cy0;
{
	MOS_disp(0);
	switch( dspmode ){
		case 0: break;
		case 1: WORD(para + 0) = 2;
			WORD(para + 2) = cx;
			WORD(para + 4) = cy;
			WORD(para + 6) = cx0;
			WORD(para + 8) = cy0;
			EGB_unConnect(ework,para);
			break;
		case 2: WORD(para + 0) = cx;
			WORD(para + 2) = cy;
			WORD(para + 4) = cx0;
			WORD(para + 6) = cy0;
			EGB_rectangle(ework,para);
			break;
		case 3: WORD(para + 0) = cx0 - ( xd >> 1 );
			WORD(para + 2) = cy0 - ( yd >> 1 );
			WORD(para + 4) = cx0 - ( xd >> 1 ) + xd;
			WORD(para + 6) = cy0 - ( yd >> 1 ) + yd;
			EGB_rectangle(ework,para);
			break;
		case 4: WORD(para + 0) = cx0;
			WORD(para + 2) = cy0;
			WORD(para + 4) = cx0 + xd;
			WORD(para + 6) = cy0 + yd;
			EGB_rectangle(ework,para);
			break;
		case 5: WORD(para + 0) = 2;
			WORD(para + 2) = cx0-5;
			WORD(para + 4) = cy0;
			WORD(para + 6) = cx0+5;
			WORD(para + 8) = cy0;
			EGB_unConnect(ework,para);
			WORD(para + 2) = cx0;
			WORD(para + 4) = cy0-5;
			WORD(para + 6) = cx0;
			WORD(para + 8) = cy0+5;
			EGB_unConnect(ework,para);
			break;
		case 6: WORD(para + 0) = 2*cx-cx0;
			WORD(para + 2) = 2*cy-cy0;
			WORD(para + 4) = cx0;
			WORD(para + 6) = cy0;
			EGB_rectangle(ework,para);
			break;
		}
	return 0;
}

polygon1(poly_para,buffer)		/* ポリゴン基本セット */
int poly_para[];
char *buffer;
{
	int ax1, ay1, ax2, ay2;
	int x0,y0,ydis,d,loop,i,add,dini,numini;
	double num,deg;

	EGB_writePage(ework,0);			/* mode10に書き込み */
	MOS_horizon(0,319);
	MOS_vertical(0,239);
	MOS_setpos( 160, 120 );
	ax1 = 0; ay1 = 0; ax2 = 0; ay2 = 0;
	poly_para[0] = 0;			/* poly_para[0] = pn */
	poly_para[1] = ax1; poly_para[2] = ay1;
	poly_para[3] = ax2; poly_para[4] = ay2;
plygn0:	pn = 0;					/* pn = 0 */
	poly1(buffer);
	mouse(mpara,0,0,11);
	if( sw > 1 ){
		MOS_horizon(0,639);
		MOS_vertical(0,479);
		MOS_setpos( 320, 240 );
		return -1;
	}
	poly[0][0] = cx;
	x0 = cx;
	ax1 = cx;
	ax2 = cx;
	d=0;
	poly[0][1] = cy;
	y0 = cy;
	ay1 = cy;
	ay2 = cy;
plygn1:	mouse(mpara,0,0,3);
	if( sw == 3 ){
		mouse(mpara,0,0,0);
		polygon2(buffer);
		goto plygn0;
	}
	if( (cx == x0) && (cy == y0) && (sw == 1) )goto plygn1;
plygn2:	if( pn < POLYMAX ){
		poly[pn + 1][0] = cx;
		poly[pn + 1][1] = cy;
		DWORD(para + 0) = (unsigned int)buffer;
		DWORD(para + 4) = (unsigned int)poly;
		DWORD(para + 8) = 0x104;
		DWORD(para + 12) = 1;
		DWORD(para + 16) = pn;
		DWORD(para + 20) = 1;
		pline(gwork,para);
		pn = pn + 1;
	}
	ydis = cy - y0;
	if( ydis == 0 )goto plygn3;
	num = 512*y0 + x0;
	deg = 512 + ( (double)cx - (double)x0 ) / (double)ydis;
	if( ydis < 0 )deg = -deg;
	loop = ydis;
	if( loop < 0 )loop = -loop;
	if( d * ydis >= 0 ){
		loop = loop - 1;
		num = num + deg;
	}
	for(i=0;i<=loop;i++){
		add = (int)( num + .5 ) * 2;
		WORD( buffer + add ) = (WORD( buffer + add )) ^ 0x8000;
		num = num + deg;
	}
	if( d == 0 ){
		dini = ydis;
		numini = 512*y0 + x0;
	}
	d = 1;
	if( ydis < 0 )d = -1;
plygn3:	if( ax1 > cx )ax1 = cx;
	if( ax2 < cx )ax2 = cx;
	if( ay1 > cy )ay1 = cy;
	if( ay2 < cy )ay2 = cy;
	x0 = cx;
	y0 = cy;
	if( sw == 1 ){
		for(i=0;i<100;i++);
		goto plygn1;
	}
	if( sw == 2 ){
		sw = 0;
		cx = poly[0][0];
		cy = poly[0][1];
		goto plygn2;
	}
	if( d*dini < 0 ){
		add = numini*2;
		WORD( buffer + add ) = (WORD( buffer + add )) ^ 0x8000;
	}
	poly2(buffer,ay1,ay2);
	poly_para[0] = pn;			/* poly_para[0] = pn */
	poly_para[1] = ax1; poly_para[2] = ay1;
	poly_para[3] = ax2; poly_para[4] = ay2;
	MOS_horizon(0,639);
	MOS_vertical(0,479);
	MOS_setpos( 320, 240 );
	return 0;
}

polygon2(buffer)		/* ポリゴンLINEセット */
char *buffer;
{
	if( pn == 0 )return -1;
	MOS_disp(0);
	DWORD(para + 0) = (unsigned int)buffer;
	DWORD(para + 4) = (unsigned int)poly;
	DWORD(para + 8) = 0x104;
	DWORD(para + 12) = 3;
	DWORD(para + 16) = 0;
	DWORD(para + 20) = pn;
	pline(gwork,para);
	return 0;
}

polygon3(buffer)		/* ポリゴンclear */
char *buffer;
{
	pn = 0;
	poly1( buffer );
	return 0;
}

itochar(n,count,p)	/* n --> char p[count] */
int n,count;
char *p;
{
	char dsp[] = "0123456789ABCDEF";

	if( n < 0 ){
		*p++ = '-';
		*p++ = '-';
		*p++ = '-';
		*p = (char)0;
		return 0;
	}
	switch( count ){
		case 8: *p++ = dsp[ n/10000000 ];
			n = n % 10000000;
		case 7: *p++ = dsp[ n/1000000 ];
			n = n % 1000000;
		case 6: *p++ = dsp[ n/100000 ];
			n = n % 100000;
		case 5: *p++ = dsp[ n/10000 ];
			n = n % 10000;
		case 4: *p++ = dsp[ n/1000 ];
			n = n % 1000;
		case 3: *p++ = dsp[ n/100 ];
			n = n % 100;
		case 2: *p++ = dsp[ n/10 ];
			n = n % 10;
		case 1: *p++ = dsp[ n ];
			*p = (char)0;
	}
	return 0;
}

ginput( p, x, y, max )		/* キーボード入力 */
char *p;
int x,y,max;
{
	int i,a;

	MOS_disp(0);
	EGB_paintMode(ework,0x22);
	EGB_writeMode(ework,0);
	EGB_color(ework,0,C_COLOR);
	BYTE( p + max ) = 0;

gin01:	for ( i=0 ; i<=max ; i++ ){
		if( BYTE( p + i ) == 0 )break;
	}
	gprint( p, x, y );

	EGB_color(ework,0,W_COLOR);		/* 2 Brock del */
	EGB_color(ework,2,W_COLOR);
	WORD(para+0) = x + i*8;
	WORD(para+2) = y - 15;
	WORD(para+4) = x + i*8 + 15;
	WORD(para+6) = y;
	EGB_rectangle(ework,para);
	EGB_color(ework,0,C_COLOR);

	gprint( "_", x+i*8, y+1 );
gin02:	a = keyinput();
	if( a == -1 )return 0;
	if( (a == 0x08) && (i > 0) ){
		BYTE( p + i -1 ) = 0;
		goto gin01;
	}
	if( a == 0x0d )return 0;
	if( (a < 0x20) || (a == 0x7f) )goto gin02;
	if( i < max ){
		WORD( p + i ) = a;
		EGB_color(ework,0,W_COLOR);
		gprint( "_", x+i*8, y+1 );
		EGB_color(ework,0,C_COLOR);
	}
	goto gin01;
}

keyinput()		/* 1文字input */
{
	char p[32], q[32];

	MOS_disp(1);
	DWORD(p+0) = 0x0901;
	do{
		keyin(q,p);
		MOS_rdpos(&sw,&cx,&cy);	/* mouse sw1 -> back */
		if( sw & 1 )return -1;
	}while( BYTE(q + 13) == 0xff );	/* DH = 0xff->(no input) */
	MOS_disp(0);
	return BYTE(q + 12);		/* DL = key input */
}

gprint( p, x, y )	/* LINE PRINT */
char *p;
int x,y;
{
	int i;
	char dsp[86];

	EGB_writePage(ework,1);			/* mode3に書き込み */
	WORD(dsp+0) = x;
	WORD(dsp+2) = y;
	for ( i=0 ; i<80 ; i++ ){
		dsp[ i + 6 ] = (char)( BYTE( p + i ) );
		if( dsp[ i + 6 ] == (char)0 )break;
	}
	WORD(dsp+4) = i;
	EGB_writeMode(ework,0);
	EGB_sjisString(ework,dsp);
	return 0;
}

gprint2( p, x, y )	/* LINE PRINT ( OVER WRITE ) */
char *p;
int x,y;
{
	int i;
	char dsp[70];

	EGB_writePage(ework,1);			/* mode3に書き込み */
	for ( i=0 ; i<64 ; i++ ){
		dsp[ i + 6 ] = (char)( BYTE( p + i ) );
		if( dsp[ i + 6 ] == (char)0 )break;
	}
	EGB_paintMode(ework,0x22);
	EGB_writeMode(ework,0);
	EGB_color(ework,0,W_COLOR);		/* Brock del */
	EGB_color(ework,2,W_COLOR);
	WORD(para+0) = x;
	WORD(para+2) = y - 15;
	WORD(para+4) = x + i*8;
	WORD(para+6) = y;
	EGB_rectangle(ework,para);
	EGB_color(ework,0,C_COLOR);
	WORD(dsp+0) = x;
	WORD(dsp+2) = y;
	WORD(dsp+4) = i;
	EGB_sjisString(ework,dsp);
	return 0;
}

dezitize(mode)
int mode;
{
	MOS_disp(0);
	EGB_displayPage(ework,0,1);
	if( mode ){
		EGB_resolution(ework,0,16);
		EGB_displayStart(ework,2,4,2);
	}
	else{
		EGB_resolution(ework,0,11);
		EGB_resolution(ework,1,11);
	}
	EGB_dezitize(ework,1);
	do{ mouse(mpara,0,0,1); }while( sw != 1 );
	EGB_dezitize(ework,0);
	mouse(mpara,0,0,0);
	EGB_resolution(ework,0,10);
	EGB_resolution(ework,1,3);
	EGB_writePage(ework,0);
	EGB_displayStart(ework,2,2,2);
	EGB_displayStart(ework,3,320,240);
	EGB_writePage(ework,1);
	EGB_displayPage(ework,1,3);
	DWORD(para+0) = 1;		/* files背景色 */
	DWORD(para+4) = 7;
	DWORD(para+8) = C_FL;
	EGB_palette(ework,1,para);
	return 0;
}

/* file selector */

filename( path, fullname )
char path[65], fullname[80];
{
	int i;
	char dsp[] = "<<FILES>>         DRIVER ( A B C D E F G H I J K L M N O P Q )";

	windget();
	gprint( dsp, 0, 463 );
	gprint( "Input PATH NAME ? ", 0, 479 );
	gprint( path, 144, 479 );
	MOS_disp(1);
	sw = 0;
	ginput( path, 144, 479, 44 );
	if( (sw & 1) && (cy>447) && (cy<463) && (cx>208) && (cx<488) ){
		mouse(mpara,0,0,0);
		for( i=0 ; i<17 ; i++ ){
			if( cx < 228 + 16*i ){
				path[0] = (char)( 'A' + i );
				path[1] = ':';
				path[2] = (char)0;
				break;
			}
		}
	}
	if( path[0] == (char)0 ){
		path[0] = '\\';
		get_directory( 0, path+1 );
	}
	MOS_disp(0);
	return look_files( path, fullname );
}

look_files( path, fullname )
char path[64], fullname[80];
{
	int i,j,k,n,m;
	char out[64], dta[64], name[48][14];

/*	int point[18][2] = {	{   8, 96 },
				{ 232, 96 },
				{ 456, 96 },
				{   8,160 },
				{ 232,160 },
				{ 456,160 },
				{   8,224 },
				{ 232,224 },
				{ 456,224 },
				{   8,288 },
				{ 232,288 },
				{ 456,288 },
				{   8,352 },
				{ 232,352 },
				{ 456,352 },
				{   8,416 },
				{ 232,416 },
				{ 456,416 }
			   };			*/

	int point[][2] = {
				{   8, 76 },
				{ 232, 76 },
				{ 456, 76 },

				{   8,100 },
				{ 232,100 },
				{ 456,100 },

				{   8,124 },
				{ 232,124 },
				{ 456,124 },

				{   8,148 },
				{ 232,148 },
				{ 456,148 },

				{   8,172 },
				{ 232,172 },
				{ 456,172 },

				{   8,196 },
				{ 232,196 },
				{ 456,196 },

				{   8,220 },
				{ 232,220 },
				{ 456,220 },

				{   8,244 },
				{ 232,244 },
				{ 456,244 },

				{   8,268 },
				{ 232,268 },
				{ 456,268 },

				{   8,292 },
				{ 232,292 },
				{ 456,292 },

				{   8,316 },
				{ 232,316 },
				{ 456,316 },

				{   8,340 },
				{ 232,340 },
				{ 456,340 },

				{   8,364 },
				{ 232,364 },
				{ 456,364 },

				{   8,388 },
				{ 232,388 },
				{ 456,388 },

				{   8,412 },
				{ 232,412 },
				{ 456,412 },

				{   8,436 },
				{ 232,436 },
				{ 456,436 }
			   };

	char dsp[] = "<<FILES>> NEXT                                                              EXIT";
	char para2[64], para3[64],path2[64];	/* path2保存用 */

	windget();
	for( i=0 ; i<64 ; i++ )path2[i] = path[i];	/* 保存 */
file0A:	if( path[0] == (char)0 ){
		path[0] = '\\';
		path[1] = (char)0;
	}
	if( path[0] != (char)0 ){
		k = 0;
		for( i = 0 ; i<59 ; i++ ){
			if( path[i] == (char)0 )break;
			if( (path[i] == '*') || (path[i] == '.') ){
				k = 1;
				break;
			}
		}
		if( k )for( i = 0 ; i<64 ; i++ )path[i] = path2[i];
		for( i = 0 ; i<59 ; i++ ){
			para3[i] = path[i];
			if( para3[i] == (char)0 )break;
		}
		if( k == 0 ){
			if( para3[i-1] != '\\' ){
				path[i] = '\\';
				path[i+1] = (char)0;
				para3[i++] = '\\';
			}
			para3[i++] = '*';
			para3[i++] = '.';
			para3[i++] = '*';
			para3[i++] = (char)0;
		}
	}
	EGB_color(ework,0,B_COLOR);
	EGB_color(ework,2,B_COLOR);
	EGB_paintMode(ework,0x22);
	EGB_writeMode(ework,0);
	WORD(para+0) = 0;
	WORD(para+2) = 0;
	WORD(para+4) = 639;
	WORD(para+6) = 479;
	EGB_rectangle(ework,para);
	EGB_color(ework,0,W_COLOR);
	EGB_color(ework,2,W_COLOR);
	EGB_paintMode(ework,0x22);
	EGB_writeMode(ework,0);
	WORD(para+0) = 0;
	WORD(para+2) = 0;
	WORD(para+4) = 639;
	WORD(para+6) = 47;
	EGB_rectangle(ework,para);
	WORD(para+0) = 0;
	WORD(para+2) = 448;
	WORD(para+4) = 639;
	WORD(para+6) = 479;
	EGB_rectangle(ework,para);
	EGB_color(ework,0,C_COLOR);
	gprint( dsp, 0, 463 );
file00:	n = 0;
	DWORD(para2+0) = ( unsigned int )para3;
	DWORD(para2+4) = ( unsigned int )out;
	DWORD(para2+8) = ( unsigned int )dta;
	DWORD(para2+12) = 0x30;
	DWORD(para2+16) = 0;
	k = files( gwork, para2 );
	if( k != 0 ){
		gprint( "File Not found", 8, 32 );
		goto file03;
	}
	gprint( "<<PATH NAME>>", 8, 32 );		/* path name disp */
	gprint( path, 120, 32 );
	gprint( out, point[0][0], point[0][1] );	/* first disp */
	itochar( DWORD( dta + 0x1a ), 8, out + 16 );
	if( dta[0x15] != 0x10 ){			/* file name */
		gprint( out + 16, point[0][0] + 112, point[0][1] );
	}
	if( dta[0x15] == 0x10 ){			/* dir */
		gprint( " <<DIR>>", point[0][0] + 112, point[0][1] );
	}
	for( i=0 ; i<13 ; i++ )name[0][i] = dta[ i + 0x1e ];	/* f-name */
	name[0][13] = dta[ 0x15 ];				/* attr. */
	n++;
file01:	DWORD(para2+0) = ( unsigned int )para3;
	DWORD(para2+4) = ( unsigned int )out;
	DWORD(para2+8) = ( unsigned int )dta;
	DWORD(para2+12) = 0x30;
	DWORD(para2+16) = 1;
	k = files( gwork, para2 );
	if( k != 0 )goto file02;
	gprint( out, point[n][0], point[n][1] );
	itochar( DWORD( dta + 0x1a ), 8, out + 16 );
	if( dta[0x15] != 0x10 ){			/* file name */
		gprint( out + 16, point[n][0] + 112, point[n][1] );
	}
	if( dta[0x15] == 0x10 ){			/* dir */
		gprint( " <<DIR>>", point[n][0] + 112, point[n][1] );
	}
	for( i=0 ; i<13 ; i++ )name[n][i] = dta[ i + 0x1e ];	/* f-name */
	name[n][13] = dta[ 0x15 ];				/* attr. */
	n++;
	if( n < 48 )goto file01;
file02:	if( n == 0 )goto file0A;
file03:	MOS_disp(1);				/* command */
	do{ mouse(mpara,0,0,0); }while( sw & 2 ); /* sw=2 は決定の意思なし */
	MOS_disp(0);
	if( (cy > 447) && (cy < 463) ){
		if( cx < 72 )goto file02;
		if( cx < 120 ){			/* next */
			EGB_color(ework,0,B_COLOR);
			EGB_color(ework,2,B_COLOR);
			EGB_paintMode(ework,0x22);
			EGB_writeMode(ework,0);
			WORD(para+0) = 0;
			WORD(para+2) = 48;
			WORD(para+4) = 639;
			WORD(para+6) = 447;
			EGB_rectangle(ework,para);
			EGB_color(ework,0,C_COLOR);
			n = 0;
			if( k == 0 )goto file01;
			if( k != 0 )goto file00;
		}
		if( cx < 600 )goto file02;	/* nothing */
		if( cx < 640 ){			/* exit */
			for( i=0 ; i<64 ; i++ ){
				fullname[i] = path[i];
				if( (path[i]==(char)0)||(path[i]=='*') )break;
			}
			fullname[i] = (char)0;
			EGB_clearScreen(ework);
			return 1;
		}
	}
	for( i = 0 ; i < n ; i++ ){
		if( (cx>point[i][0]) && (cx<point[i][0]+176) && (cy>point[i][1]-16) && (cy<point[i][1]) )break;
	}
	if( i >= n )goto file02;		/* nothing */
	if( name[i][13] == (char)(0x10) ){		/* path name */
		if( WORD( *(name + i) ) == 0x2e )goto file02;	/* '.' */
		if( WORD( *(name + i) ) == 0x2e2e ){		/* '..' */
			for( j=0 ; j<59 ; j++ ){	/* 0 search */
				if( path[j] == (char)0 )break;
			}
			if( (j>=59) || (j < 2) )goto file02;	/* too long */
			j = j - 2;
			for( m=j ; m>=0 ; m-- ){
				if( path[m] == '\\' )break;
			}
			if( m < 0 )goto file02;
			path[m] = (char)0;
			goto file0A;
		}
		for( j=0 ; j<59 ; j++ ){
			if( path[j] == (char)0 )break;
		}
		if( j>=59 )goto file02;
		for( m=0 ; m<13 ; m++ ){
			if( j >= 59 )break;
			path[ j++ ] = name[i][m];
			if( name[i][m] == (char)0 )break;
		}
		goto file0A;
	}
	for( j=0 ; j<64 ; j++ ){	/* fullname=path+fname */
		fullname[j] = path[j];
		if( (path[j] == (char)0) || (path[j] == '*') )break;
	}
	for( m=0 ; m<13 ; m++ ){
		fullname[j++] = name[i][m];
		if( name[i][m] == (char)0 )break;
	}
	EGB_clearScreen(ework);
	return 0;
}

fileinput( fullname )
char fullname[80];
{
	windget();
	gprint( "<<FILE-NAME>>", 0, 463 );
	gprint( "Input FILE NAME ? ", 0, 479 );
	ginput( fullname, 144, 479, 44 );
	windput();
	return 0;
}

/* mov2 連続replay */

check( namemov )
char *namemov;
{
	FILE *fpl;
	int temp, page, size, n, data[64];
	char para[80];

	if( ( fpl = fopen( namemov, "rb" ) ) == NULL )return 1;
	temp = fread( (char *)data, 1, 256, fpl );
	if( temp < 256 )goto chk10;
	if( data[0] != 0x32564f4d )goto chk10;
	if( data[1] != 16 )goto chk10;
	if( data[4] != 320 )goto chk10;
	if( data[5] != 240 )goto chk10;
	DWORD( para+0 ) = (unsigned int)bbuf;
	DWORD( para+4 ) = (unsigned int)bbuf+0x40000;
	DWORD( para+8 ) = 0;
	DWORD( para+12) = 0;
	n = 0;
chk1:	if( n >= data[3] ){
		fseek( fpl, 256, SEEK_SET);
		n = 0;
	}
	temp = fread( bbuf, 1, 32, fpl );
	if( temp < 32 )goto chk10;
	page = DWORD( bbuf ); size = DWORD( bbuf + 4 );
	if( (unsigned int)size > 500000 )goto chk10;
	temp = fread( bbuf+32, 1, size, fpl );
	if( temp < size )goto chk10;
	WORD( bbuf+12 ) = 0;		/* wait なし */
	move32( para );
	n++;
	MOS_rdpos(&sw,&cx,&cy);		/* end check */
	if( sw == 0 )goto chk1;
chk8:	MOS_rdpos(&sw,&cx,&cy);		/* waite loop */
	if( sw & 1 ){
		while( sw == 3 )MOS_rdpos(&sw,&cx,&cy);
		if( sw == 2 )goto chk9;
		while( sw ){
			MOS_rdpos(&sw,&cx,&cy);
			if( sw == 3 )break;
		}
		goto chk1;
	}
chk9:	if( sw )goto chk8;
	fclose( fpl );
	return 0;
chk10:	fclose( fpl );
	return 58;
}

error_check(number)
int number;
{
	char p[16];

	if( number == 0 )return 0;
	MOS_disp(0);
	windget();
	EGB_color(ework,0,E_COLOR);
	gprint( "<<ERROR>>", 0, 471 );
	if( number == 4 )gprint( "data not found", 88, 471 );
	if( number == 7 )gprint( "out of memory", 88, 471 );
	if( number == 54 )gprint( "out of page", 88, 471 );
	if( number == 55)gprint( "bad file name", 88, 471 );
	if( number == 58)gprint( "bad data in file", 88, 471 );
	if( number == 100)gprint( "bad quadrangle", 88, 471 );
	if( number == 1 )gprint( perror( NULL ), 88, 471 );
	if( number == 2 )gprint( perror( NULL ), 88, 471 );
	/*itochar( number, 8, p );
	gprint( p, 0, 400 );*/		/* check for 開発用 */
	gprint( "press mouse button", 352, 471 );
	EGB_color(ework,0,C_COLOR);
	mouse(mpara,0,0,0);
	windput();
	return -1;
}

void main()
{
	char path1[80];		/* PATH NAME1 */
	char fullname1[80];	/* PATH + FILES NAME1 */
	char namemov[80];	/* mov file name */
	char dsp1[] = "<<RECORD>>  EDIT                                                    FILES    END";
	char dsp2[] = "NEW-REC  ADD-REC  REPLAY  FILENAME<<                                          >>";

	ini();
main00:	MOS_disp(0);
	windget();
	gprint(dsp1,0,463);
	gprint(dsp2,0,479);
	gprint2( fullname1, 296, 479 );
main01:	MOS_disp(1);
	mouse(mpara,0,0,0);
	if( (cy < 447) || (sw != 1) )goto main01;
	MOS_disp(0);
	if( cy < 463 ){
		if( cx < 88 )goto main01;
		if( cx < 136 ){				/* edit */
		    if( error_check( mov_file_set(fullname1,namemov) )==0 ){
			error_check( mov_sound_save( namemov ) );
		    }
		    goto main00;
		}
		if( cx < 536 )goto main01;
		if( cx < 592 ){				/* files */
		    windput();
		    filename( path1, fullname1 );
		    goto main00;
		}
		if( cx < 608 )goto main01;
		if( cx < 640 ){				/* end */
		    windput();
		    end();
		    return;
		}
		goto main01;
	}
	if( cy < 480 ){
		if( cx < 64 ){				/* new rec */
		    windput();
		    if( error_check( mov_file_set(fullname1,namemov) )==0 ){
			svar[0] = 0;			/* page  */
			svar[1] = 0;			/* total */
			error_check( mov_save(namemov) );
		    }
		    goto main00;
		}
		if( cx < 136 ){				/* add rec */
		    windput();
		    if( error_check( mov_file_set(fullname1,namemov) )==0 ){
			if( error_check( mov_head_read( namemov, svar ) )==0 ){
			    error_check( mov_save(namemov) );
			}
		    }
		    goto main00;
		}
		if( cx < 200 ){				/* replay */
		    windput();
		    if( error_check( mov_file_set(fullname1,namemov) )==0 ){
		    	error_check( check(namemov) );
		    }
		    goto main00;
		}
		if( cx < 640 ){				/* file name */
		    windput();
		    fileinput( fullname1 );
		    goto main00;
		}
		goto main01;
	}
	goto main01;
}
