#include	"cds_def.h"

extern	CD_INFO 	cd_info;
extern	ENSOU_STAT	cd_stat;

extern	int 	cd_init(int);
extern	int 	cd_pause(int );
extern	int 	cd_cont (int );

int	get_cd_info(int type)
{
	union	REGS	reg;
	struct SREGS	sreg;
	int 			i=0,erf;
	
	erf=cd_pause(0);	/* 演奏中では調べられないため */
	do
	{	reg.x.ax = 0x54c0;
		reg.x.cx = 0x0000;
		reg.x.di = FP_OFF(&cd_info);
		sreg.ds  = FP_SEG(&cd_info);
		
		int86x(0x93,&reg,&reg,&sreg);
		
		if( reg.h.ah != 0 && i<1)
		{	putss("ＣＤ情報読み取り中です...");
			cd_init(1);				/* エラーがあればもう一度やり直し */
		}
	}while(++i<2);
	putss("\x1b[25D\x1b[K");
	
	if (type && erf==0)				/* 演奏中に一時停止したときは復帰する */
		cd_cont(0);
	
	if((cd_info.cd_type == 2))	/* お話にならない場合 */
	{	puts("このＣＤには音楽が入っていません！");
		exit(255);
	}
	while( chkcode(cd_info.start_track)!=0 )	/* データトラックは飛ばす */
		cd_info.start_track++;
	
	ERRreturn;
}

int get_cd_stat(int type)
{
	union	REGS	reg;
	struct	SREGS	sreg;
	
	reg.x.ax = 0x53c0;
	reg.x.cx = 0x0000;
	reg.x.di = FP_OFF(&cd_stat);
	sreg.ds  = FP_SEG(&cd_stat);
	
	int86x(0x93,&reg,&reg,&sreg) ;
	
	if(type){
		get_cd_info(1);
		putss3("このＣＤには",i2a(cd_info.end_track),"曲入っています。");
		if (cd_info.cd_type==3)
			puts("1曲目はデータトラックです。");
		else
			puts("");
		
		if ( (reg.h.ah) == 0 ){
			if ( cd_stat.cd_flame > 0 )
			{	putss3( "現在は",i2a(cd_stat.cd_flame),"曲目を演奏中です\n");
			}
			else
				puts("現在ＣＤを演奏していません。");
			
		}
	}
	/* 注 : AL を返す必要あり */
	return( ((reg.h.ah)== 0x80) ? (reg.h.ah*256 +reg.h.cl) : reg.x.ax );
}

int get_cd_stat2()
{
	int 	erf;
	erf=get_cd_stat(0);
	if( cd_stat.cd_flame <= 0 && cd_pause(0)==0x2200 )	/* pause 中? */
	{	cd_cont(0);
		erf=get_cd_stat(0);
		cd_pause(0);
	}
	return (erf);
}

void	err( int erf )
{
	if (erf == -1 )
	{	puts("    CDS [PLAY][start [end [loop ]]]"					);
		puts("                  start曲から end曲まで loop回演奏"	);
		puts("                  loop=0 で永久ループ"				);
		puts("    CDS  LOOP [start [end ]]"							);
		puts("                  start曲から end曲まで ループ演奏"	);
		puts("    CDS  BACK [loop] "								);
		puts("    CDS  FOR  [loop] "								);
		puts("                  演奏中の前／次曲から最終曲を演奏"	);
		puts("    CDS  REP  [loop] "								);
		puts("                  演奏中の曲をリピート演奏"			);
		puts("    CDS  PAUSE    演奏を一時停止／再開 (トグル動作)"	);
		puts("    CDS  CONT     演奏を再開"							);
		puts("    CDS  STOP     演奏を停止"							);
		puts("    CDS  VOL  [volume] "								);
		puts("                  音量の設定"							);
		puts("    CDS  STAT     演奏状況を表示 "					);
		puts("    CDS  INIT     ＣＤ情報の初期化"					);
	}else
	{	putss(C_RED);
		if ( erf == 0x0200 )	puts("デバイス番号エラー"			);
		if ( erf == 0x1000 )	puts("ＣＤを演奏中です"				);
		if ( erf == 0x8001 )	puts("ＣＤが入っていません"			);
		if ( erf == 0x8002 )	puts("パラメータエラー"				);
		if ( erf == 0x8004 )	puts("ドライブがつながっていません"	);
		if ( erf == 0x8008 )	puts("コマンド異常終了"				);
		if ( erf == 0x8010 )	puts("ＣＤが読み取れません"			);
		if ( erf == 0x8020 )	puts("ＣＤが読み取れません"			);
		if ( erf == 0x8080 )	puts("ＣＤが交換されました"			);
		if ( erf == 0x2200 )	puts("ＣＤは PAUSE されています"	);
		if ( erf == 0x2300 )	puts("ＣＤは PAUSE されていません"	);
		putss(C_WHITE);
	}
}

int	cd_stop()
{	union	REGS	reg;
	
	reg.x.ax = 0x52c0;
	reg.x.cx = 0x0000;
	int86(0x93,&reg,&reg);
	
	putss3( C_HPINK ,"ＣＤを停止しました｡\n",C_WHITE );
	ERRreturn;
}

/******
int		_asm_time(char *, int );

#define	stop_time_asm(c) _asm_time("\n\
\tMOV\tCH,255\n\
\tMOV\tCL,AL\n\
\tMOV\tAX,21184\n\
\tINT\t147\n\
\tXOR\tAL,AL\n\
\tCMP\tAH,128\n\
\tJNE\t__aaa\n\
\tMOV\tAL,CL\n\
__aaa:\t", c )

******/
/* インラインアセンブラ化したけどあまり意味がないなぁ */	

/******
int	cd_time(int time)
{
	int	err_v;
	
	if	( ( err_v = stop_time_asm( time ) ) == 0 ){
		if	( time != 0 )
	printf ("\n\x1b[32mＣＤドライブの停止時間を %d 秒に設定しました｡\x1b[0m\n"
																	,time);
		else
	printf ("\n\x1b[32mＣＤドライブが停止しないように設定しました｡\x1b[0m\n");
	}
	return( err_v ); 
}

{
	union	REGS	reg;

	reg.x.ax = 0x52c0;
	reg.x.cx = ( 0xff00 | ( time & 0x00ff) ) ;
	
	int86(0x93,&reg,&reg) ;

	if	( reg.h.ah== 0 ){
		if	( time != 0 )
	printf ("\n\x1b[32mＣＤドライブの停止時間を %d 秒に設定しました｡\x1b[0m\n"
																		,time);
		else
	printf ("\n\x1b[32mＣＤドライブが停止しないように設定しました｡\x1b[0m\n")			;	
	}
	return( (reg.h.ah == 0x80) ? reg.h.ah * 256 + reg.h.cl : reg.h.ah *256 ); 
}
*******/
