/********************************************************************
 *																	*
 *							ＤＩＳＫＤＵＰ							*
 *																	*
 *						オンメモリ型 DISKCOPY						*
 *																	*
 *							diskdup.exp								*
 *																	*
 *							for FM-TOWNS							*
 *																	*
 *			Copyright (c) ちにゃと ＆ Ｔｙｍｉｃ 1992. 1993.		*
 *																	*
 *							メイン ヘッダー							*
 *																	*
 ********************************************************************/

typedef unsigned char		uchar;		/* 無符号  8 bit */
typedef unsigned short		ushort;		/* 無符号 16 bit */
typedef unsigned int		uint;		/* 無符号 32 bit */
typedef unsigned long		ulong;		/* 無符号 32 bit */


/********************************************************************
	定数定義
*********************************************************************/

#define	VER				"0.90a"			/* ﾊﾞｰｼﾞｮﾝ 番号 */

#define	OK				0				/* 正常 */
#define	NG				-1				/* 異常 */
#define	TRUE			1				/* 真 */
#define	FALSE			0				/* 偽 */

#define MAXHEAD			2				/* ﾍｯﾄﾞ 番号最大値 */

#define MAXCYL_2HD		77				/* 2HD ｼﾘﾝﾀﾞ 番号最大値 */
#define MAXCYL_2HC		80				/* 2HC ｼﾘﾝﾀﾞ 番号最大値 */
#define MAXCYL_2DD		80				/* 2DD ｼﾘﾝﾀﾞ 番号最大値 */

#define MAXSEC_12		8				/* 1.2M 2HD ｾｸﾀ 番号最大値 */
#define MAXSEC_720		9				/* 720K 2DD ｾｸﾀ 番号最大値 */
#define MAXSEC_640		8				/* 640K 2DD ｾｸﾀ 番号最大値 */
#define MAXSEC_12C		15				/* 1.2M 2HC ｾｸﾀ 番号最大値 */
#define MAXSEC_1440		18				/* 1.44 2HC ｾｸﾀ 番号最大値 */

#define SECLEN512		512				/* ｾｸﾀ ﾚﾝｸﾞｽ 512 */
#define SECLEN1024		1024			/* ｾｸﾀ ﾚﾝｸﾞｽ 1024 */

#define MODE1_12		0x0003			/* 1.2M 2HD ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 1 */
#define MODE2_12		0x0208			/* 1.2M 2HD ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 2 */
#define MODE1_720		0x0012			/* 720K 2DD ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 1 */
#define MODE2_720		0x0209			/* 720K 2DD ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 2 */
#define MODE1_640		0x0012			/* 640K 2DD ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 1 */
#define MODE2_640		0x0208			/* 640K 2DD ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 2 */
#define MODE1_12C		0x0002			/* 1.2M 2HC ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 1 */
#define MODE2_12C		0x020F			/* 1.2M 2HC ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 2 */
#define MODE1_1440		0x0042			/* 1.44M 2HC ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 1 */
#define MODE2_1440		0x0212			/* 1.44M 2HC ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 2 */

#define FD0_DRVNO		0x0020			/* ﾌﾛｯﾋﾟｰ ﾃﾞﾊﾞｲｽ 0 */
#define FD1_DRVNO		0x0021			/* ﾌﾛｯﾋﾟｰ ﾃﾞﾊﾞｲｽ 1 */

#define DISKSIZE		SECLEN1024 * \
						MAXSEC_12 * \
						MAXCYL_2HD * \
						MAXHEAD			/* ﾃﾞｨｽｸ 読み込み ﾊﾞｯﾌｧ ﾚﾝｸﾞｽ */

enum _DISKTYPE {						/* ﾌﾛｯﾋﾟｰ ﾃﾞｨｽｸ 種別番号 */
	TYPE_NOT			= 0,			/* 未対応 ﾃﾞｨｽｸ */
	TYPE_2HD_12,						/* 1.2M 2HD */
	TYPE_2DD_720,						/* 720K 2DD */
	TYPE_2DD_640,						/* 640K 2DD */
	TYPE_2HC_12,						/* 1.2M 2HC */
	TYPE_END,							/* ﾀﾞﾐｰ */
};

enum _ERRCODE {							/* ｴﾗｰ ﾒｯｾｰｼﾞ 番号 */
	NOERR				= 0,			/* ｴﾗｰ 無し 正常終了 */
	ERRMODESET,							/* ﾓｰﾄﾞ ｾｯﾄ ｴﾗｰ */
	ERRDISKREAD,						/* ﾃﾞｨｽｸ ﾘｰﾄﾞ ｴﾗｰ */
	ERRDISKWRITE,						/* ﾃﾞｨｽｸ ﾗｲﾄ ｴﾗｰ */
	ERRDISKSET,							/* ﾃﾞｨｽｸ 設定 ｴﾗｰ */
	ERRDISKTYPE,						/* 未対応 ﾃﾞｨｽｸ ｴﾗｰ */
	ERRNOTDISK,							/* ﾄﾞﾗｲﾌﾞ ﾉｯﾄ ﾚﾃﾞｨｰ */
	ERRPROTECT,							/* 書き込み禁止 */
	ERRFORMAT,							/* ﾌｫ-ﾏｯﾄ ｴﾗ- */
};

#define PreAmblLength		146			/* ﾌﾟﾚ ｱﾝﾌﾞﾙ ﾃﾞｰﾀ ﾚﾝｸﾞｽ */
#define PosAmblLength		600			/* ﾎﾟｽﾄ ｱﾝﾌﾞﾙ ﾃﾞｰﾀ ﾚﾝｸﾞｽ */
#define SecData1024Length	1200		/* 1024 ｾｸﾀ ﾃﾞｰﾀ ﾚﾝｸﾞｽ */
#define SecData512Length	688			/* 512 ｾｸﾀ ﾃﾞｰﾀ ﾚﾝｸﾞｽ */

#define RETRYMAX			7			/* ｴﾗｰ ﾘﾄﾗｲ 回数 */


/********************************************************************
	構造体定義
*********************************************************************/

typedef struct _FORMPARA {		/* ﾌｫｰﾏｯﾄ ﾃﾞｰﾀ 圧縮形式 */
	int		fdata;				/* ﾌｫｰﾏｯﾄ ﾃﾞｰﾀ */
	int		cnt;				/* 展開 ﾚﾝｸﾞｽ */
} FORMPARA;

typedef struct _IntParaBlk {	/* ﾘｱﾙ ﾓｰﾄﾞ 割り込み発行 ﾊﾟﾗﾒｰﾀ ﾌﾞﾛｯｸ */
	ushort	intno;				/* 割り込み番号 */
	ushort	rds;				/* ﾘｱﾙ ﾓｰﾄﾞ ds */
	ushort	res;				/* ﾘｱﾙ ﾓｰﾄﾞ es */
	ushort	rfs;				/* ﾘｱﾙ ﾓｰﾄﾞ fs */
	ushort	rgs;				/* ﾘｱﾙ ﾓｰﾄﾞ gs */
	uint	reax;				/* ﾘｱﾙ ﾓｰﾄﾞ eax */
	uint	redx;				/* ﾘｱﾙ ﾓｰﾄﾞ edx */
} IntParaBlk;


/********************************************************************
	外部参照
*********************************************************************/

#ifndef	__PRGMAIN__
extern char Title1[];				/* ﾀｲﾄﾙ 1 */
extern char Title2[];				/* ﾀｲﾄﾙ 2 */
extern char *ErrMsgTbl[];			/* ｴﾗｰ ﾒｯｾｰｼﾞ ﾃｰﾌﾞﾙ */
extern int option;					/* ｵﾌﾟｼｮﾝ ﾃﾞｰﾀ */
#endif


/********************************************************************
	プロトタイプ
*********************************************************************/

void main( int, char ** );					/* ﾒｲﾝ 処理 */
void PrgExit1( void );						/* ﾌﾟﾛｸﾞﾗﾑ 終了処理 */
void PrgExit2( void );						/* ﾌﾟﾛｸﾞﾗﾑ 終了処理 */
void CopyPrgMain( void );					/* ｺﾋﾟｰ ﾌﾟﾛｸﾞﾗﾑ ﾒｲﾝ */
int SetDiskDrvMode( int, int );				/* ﾄﾞﾗｲﾌﾞ ﾓｰﾄﾞ 設定 */
int ReadDiskAll( int, char *, int );		/* ﾃﾞｨｽｸ 読み込み */
int WriteDiskAll( int, char *, int );		/* ﾃﾞｨｽｸ 書き込み */
int TrackFormat( int, int, int );			/* 1 ﾄﾗｯｸ ﾌｫｰﾏｯﾄ */
void MakeFormData( int, int, int );			/* ﾌｫｰﾏｯﾄ ﾃﾞｰﾀ 作成 */
int ChkFormatType( int );					/* ﾌｫｰﾏｯﾄ ﾀｲﾌﾟ ﾁｪｯｸ */


/* end of file */
