#define		FD_SID0		0
#define		FD_TRK0		0

#define		FDmode_MFM		0x00
#define		FDmode_FM		0x80
#define		FDmode_HD		0x00
#define		FDmode_DD		0x10
#define		FDmode_D		0x20
#define		FDmode_ERR		0xFF

#define		FDmode_0128		0x00
#define		FDmode_0256		0x01
#define		FDmode_0512		0x02
#define		FDmode_1024		0x03

#define		FDerr_STAT		0x8000	//	エラーフラグ 
#define		FDerr_DMA		0x80	//	DMAエラー 
#define		FDerr_TIM		0x40	//	TIME OVER 
#define		FDerr_DAT		0x20	//	データ欠落 
#define		FDerr_CRC		0x10	//	CRCエラー 
#define		FDerr_RNF		0x08	//	レコードノットファウンド 
#define		FDerr_DDM		0x04	//	削除データマーク 
#define		FDerr_PRO		0x02	//	ライトプロテクト 
#define		FDerr_DNR		0x01	//	ドライブノットレディ 

#define		FDerr_DEV		-1		//	デバイス番号がFDではない｡ 


//	倍密度/単密度､HD/DD(D)の区別
//	･すでにHD/DD/Dの区別が済んでいる場合は､mode=FDmode_HD/DD/Dにしてください｡ 
//	 初めての場合は､mode=0にすると､HD/DDの区別を実施します｡ 
//	 DD/Dの区別はチェック後はFDDcheck_DDorDを実行すること 
//	･セクタ長はチェックしない(全てFDmode_0128となる)
//	･HEAD=2,SECT=31になる
int		FDDget_sectmode(dev_no,trk,sid,mode)
int		dev_no,trk,sid,mode;
{
int			FDret;
DKB_SEC		secinfo;

	DKB_seek(dev_no,trk);
	MMI_WaitLoop(25);
	if((dev_no & 0xf0)!=0x20)	return FDerr_DEV;
	if(mode==FDmode_D)
	{
		/*	MFM D	(倍密度 D)		*/
		FDret=DKB_setmode(dev_no,0x20,0x021f);
		FDret=DKB_rdsecid(dev_no,trk,sid,&secinfo);
		if((FDret & 0x80fd)==0)			return (FDmode_MFM | FDmode_D);
		if((FDret & 0x8001)==0x8001)	return 0x8001;	// not ready 
		/*	FM D	(単密度 D)		*/
		FDret=DKB_setmode(dev_no,0xa0,0x021f);
		FDret=DKB_rdsecid(dev_no,trk,sid,&secinfo);
		if((FDret & 0x80fd)==0)			return (FDmode_FM  | FDmode_D);
		return FDmode_ERR;
	}
	if(mode==FDmode_HD || mode==0)
	{
		/*	MFM HD	(倍密度 HD)		*/
		FDret=DKB_setmode(dev_no,0x00,0x021f);
		FDret=DKB_rdsecid(dev_no,trk,sid,&secinfo);
		if((FDret & 0x80fd)==0)			return (FDmode_MFM | FDmode_HD);
		if((FDret & 0x8001)==0x8001)	return 0x8001;	// not ready 
		/*	FM HD	(単密度 HD)		*/
		FDret=DKB_setmode(dev_no,0x80,0x021f);
		FDret=DKB_rdsecid(dev_no,trk,sid,&secinfo);
		if((FDret & 0x80fd)==0)				return (FDmode_FM  | FDmode_HD);
		if((FDret & 0x80fd)!=0 && mode!=0)	return FDmode_ERR;
	}
	if(mode==FDmode_DD || mode==0)
	{
		/*	MFM DD	(倍密度 DD/D)	*/
		FDret=DKB_setmode(dev_no,0x10,0x021f);
		FDret=DKB_rdsecid(dev_no,trk,sid,&secinfo);
		if((FDret & 0x80fd)==0)			return (FDmode_MFM | FDmode_DD);
		if((FDret & 0x8001)==0x8001)	return 0x8001;	// not ready 
		/*	FM DD	(単密度 DD/D)	*/
		FDret=DKB_setmode(dev_no,0x90,0x021f);
		FDret=DKB_rdsecid(dev_no,trk,sid,&secinfo);
		if((FDret & 0x80fd)==0)			return (FDmode_FM  | FDmode_DD);
	}
	/*	OTHER	*/
	return FDmode_ERR;
}


//	DD/Dチェック 
//	･戻り値はFDmode_DD/D 
//	･DDかDかを､ﾄﾞﾗｲﾌﾞをDDﾓｰﾄﾞにしてTRACK00..CHKTRKMAX-1を読み込むことで行う｡ 
//	 1つでも読めない場合､Dとする｡ 
#define	CHKTRKMAX	8
int		FDDcheck_DDorD(dev_no)
int		dev_no;
{
int			i_cnt,FDret,retID;
DKB_SEC		secinfo;

	if((dev_no & 0xf0)!=0x20)	return FDerr_DEV;
	/*	DDorD ﾁｪｯｸ	*/
	for(i_cnt=0;i_cnt<CHKTRKMAX;i_cnt++)
	{
		DKB_restore(dev_no);
		MMI_WaitLoop(25);
		DispChk();
		DKB_seek(dev_no,i_cnt);
		MMI_WaitLoop(25);
		/*	倍密度 TRK	*/
		FDret=DKB_setmode(dev_no,0x10,0x021f);
		MMI_WaitLoop(10);
		retID=DKB_rdsecid(dev_no,i_cnt,FD_SID0,&secinfo);
		if((retID & 0x80fd)!=0)
		{
			/*	単密度 TRK	*/
			FDret=DKB_setmode(dev_no,0x90,0x021f);
			MMI_WaitLoop(10);
			retID=DKB_rdsecid(dev_no,i_cnt,FD_SID0,&secinfo);
		}
		if((retID & 0x80fd)!=0)		return FDmode_D;
	}
	return FDmode_DD;
}
