/* ******************************************************************************
	Filename : file.c
	Contents : ファイル操作関連 for WonderWitch

	History  : Ver 1.00		2000/12/07		K.Kimura

****************************************************************************** */

#include	"main.h"

#define		FILE_DIVIDE		TRUE
#define		FILE_DEBUG		FALSE


/* |||■ グローバル変数定義 ■||| */

static	char far	*FileDataAdr[( int)FILE_ARCFILE_MAX];		/* ﾃﾞｰﾀﾌｧｲﾙへのﾎﾟｲﾝﾀ	*/
extern	char	buf[ 32];								/* ﾃﾝﾎﾟﾗﾘﾊﾞｯﾌｧ				*/



/* ******************************************************************************
　関　　数：
　内　　容：
　表　　記：
　引　　数：
　返　　値：
　コメント：
　履　　歴：Ver 1.00	1999/00/00		K.Kimura		初版
****************************************************************************** */
/* ******************************************************************************
　関　　数：FileRFInit
　内　　容：ファイルシステムの初期化
　表　　記：void	FileRFInit( void)
　引　　数：−
　返　　値：−
　コメント：−
　履　　歴：Ver 1.00	2000/12/07		K.Kimura		初版
****************************************************************************** */
void	FileRFInit( void)
{
	static	int		i;


	for (i = 0; i < FILE_ARCFILE_MAX; i++)
		FileDataAdr[ i] = NULL;

}

/* ******************************************************************************
　関　　数：FileSetPointer
　内　　容：アーカイブファイルの先頭メモリ設定
　表　　記：
　引　　数：−
　返　　値：−
　コメント：メモリがもったいないので、エラーチェックはしてません。
　		  ：
　履　　歴：Ver 1.00	2000/12/07		K.Kimura		初版
****************************************************************************** */
void	FileSetPointer( int idx, char *fname)
{
	static	char far	*res;
	u_short		seg, off;


#if	FILE_DIVIDE
	res = (char far *)mmap( fname);

	/* 正規化 */
	seg = FP_SEG( res);
	off = FP_OFF( res);
	seg += off / 16;
	off %= 16;
	res = MK_FP( seg, off);
#else
	res = FileFindResource(( char far *)_pc->_resource, idx);
#endif
	FileDataAdr[ idx] = res;

}

/* ******************************************************************************
　関　　数：FileGetPointer
　内　　容：アーカイブファイル内インデックスのメモリ取得
　表　　記：
　引　　数：−
　返　　値：−
　コメント：メモリがもったいないので、エラーチェックはしてません。
　		  ：
　履　　歴：Ver 1.00	2000/12/07		K.Kimura		初版
****************************************************************************** */
char far	*FileGetPointer( int idx, int num)
{
	static	char far	*ret;
	static	FILEFAT	far	*pt;


	pt = ( FILEFAT far *)FileDataAdr[ idx];
	ret = FileDataAdr[ idx] + pt[ num].sectPos;

	return ( ret);
}


/* ******************************************************************************
　関　　数：FileGetAddress
　内　　容：アーカイブファイルのメモリ取得
　表　　記：
　引　　数：−
　返　　値：−
　コメント：
　		  ：
　履　　歴：Ver 1.00	2000/12/11		K.Kimura		初版
****************************************************************************** */
char far	*FileGetAddress( int idx)
{
	static	char far	*ret;


	ret = FileDataAdr[ idx];

	return ( ret);
}


/* ******************************************************************************
　関　　数：
　内　　容：
　表　　記：
　引　　数：−
　返　　値：−
　コメント：
　		  ：
　履　　歴：Ver 1.00	2001/01/26		K.Kimura		初版
****************************************************************************** */
char far	*FileFindResource( char far *res, char idx)
{
	u_char		i, j;
	u_short		seg, off;

	static	FILEFAT	far		*fp;


	/* 正規化 */
	seg = FP_SEG( res);
	off = FP_OFF( res);

#if FILE_DEBUG
	DbgPrintPort("-------- before ---------\r\n");
	sprintf( buf, "FindIdx::%d\r\n", idx);
	DbgPrintPort( buf);
	sprintf( buf, "res::%lx\r\n", ( u_long)res);
	DbgPrintPort( buf);
	sprintf( buf, "seg,ofs::%4x,%4x\r\n", seg, off);
	DbgPrintPort( buf);
#endif

	seg += off / 16;
	off %= 16;
	res = MK_FP( seg, off);

#if FILE_DEBUG
	DbgPrintPort("-------- after ---------\r\n");
	sprintf( buf, "res::%lx\r\n", ( u_long)res);
	DbgPrintPort( buf);
	sprintf( buf, "seg,ofs::%4x,%4x\r\n", seg, off);
	DbgPrintPort( buf);
	sprintf( buf, "CS::%4x\r\n", _CS);
	DbgPrintPort( buf);
	sprintf( buf, "DS::%4x\r\n", _DS);
	DbgPrintPort( buf);
#endif

	for (i = 0; i < idx; i++)
	{
		fp = ( FILEFAT far *)res;

		while (fp->size != 0)
		{
#if FILE_DEBUG
	sprintf( buf, "fp::%lx\r\n", fp);
	DbgPrintPort( buf);
	sprintf( buf, "size::%lx\r\n", fp->size);
	DbgPrintPort( buf);
#endif
			fp++;
		}

#if FILE_DEBUG
	sprintf( buf, "res::%lx\r\n", ( u_long)res);
	DbgPrintPort( buf);
	sprintf( buf, "seg,ofs::%4x %4x\r\n", FP_SEG( res), FP_OFF( res));
	DbgPrintPort( buf);
	sprintf( buf, "fp->sectPos::%lx\r\n", fp->sectPos);
	DbgPrintPort( buf);
#endif
		/*
			fp->sectPos = ファイルサイズ
		*/
		for (j = 0; j < 4; j++)
			fp->sectPos  = ( fp->sectPos >> 1);

		res = (char far *)MK_FP( FP_SEG( res) + fp->sectPos, FP_OFF( res));
	}

	return ( res);
}

