/* まだまだ動かないけど、ディレクトリ移動は未サポートだけど、形にはなったバージョン（でもこういう形には１０月からなっていたんだ。ぐすん。ＳＹＳＴＥＭ関数がうまく動かないんだよ〜。９８ではきちんとコンパイル出来るのに）V.0.1 92/12/30 wed */

/* ひゃっほ〜！動いたよ〜ん｡やったー！！！すげぇ〜｡ V.1.00 93/01/10 SUN */
/* ちょっとした手直し････							V.1.02 93/02/04 TUE */
/* すこしのバグみたいな(^^;ﾃﾅｵｼ						V.1.02a93/07/23 FRI*/
/* lcon に対応(^^; 									V.1.03 93/07/28 WEN */
/* lcon に再対応	V.1.03α  93/10/06(水)       Reprogrammed by ＡＡＺ*/
/* さらに手直し……(^^;								V.1.04 93/10/09 SUT */
/* ほんでもって､手直し…ﾀﾞﾝﾀﾞﾝ ｼﾞｬﾏﾔﾅ､ｺﾚ（笑）      V.1.05 93/11/21 SUN*/
/* またまた手直し(笑) V.1.05b 93/12/21(月)		 Reprogrammed by ＡＡＺ*/
/* 関数の効率化…不完全バージョン(^^;               V.1.06 93/02/05 SUT*/
/* 一応効率化(*^_^*ｻｲｽﾞｶﾞﾁｲｻｸﾅｯﾀ                    V.1.06a93/02/11 FRI*/

/* 書式: 
	 	IF2 [-ln or -cl or -l or -c] [TMENU.IF2 のあるﾄﾞﾗｲﾌﾞ]  ﾌｧｲﾙ名．拡張子　
*/

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <dos.h>
#include <time.h>

void if2_check(char f_name[], char drv[]);
void if2_exec(char if2_file[], char f_name[]);
void text_init();
void text_undo();
void scr_clear(int);
void t_wait();
void call_b();
int options(char **argv);

int l = 0;
int c = 0;

union REGS r;

void main( int argc, char *argv[] )
{
	char f_name[65],drv[20];
	
	if ( argc == 4)
	{
		/* argv[3] からファイル名を取得 */
		for( l = 0; *(*(argv+3)+l) != '\0'; l++);
		memmove( f_name, *(argv+3), l+1);
		
		memmove( drv, *(argv+2), 3);
		
		options( argv);
	}
	else if ( argc == 3)
	{
		for( l = 0; *(*(argv+2)+l) != '\0'; l++);
		memmove( f_name, *(argv+2), l+1);/* argv[2] からファイル名を取得 */
		
		if ( 0 == options( argv)) /* オプションがあるか？ */
			memmove( drv, "D:", 3);
		else
			memmove( drv, *(argv+1), 3);
		
	}
	else if ( argc == 2)
	{
		memmove( drv, "D:", 3);
		for( l = 0; *(*(argv+1)+l) != '\0'; l++);
		memmove( f_name, *(argv+1), l); /* argv[1] からファイル名を取得 */
		l = 0; /* しなくてもいいけど､念のため(^^; */
	}
	else    /* 何も無しの実行(^^; */
	{
		puts ("usage : IF2 [options] [drive_name] <data_file_name.???>");
		puts ("  where options are:");
		puts ("  [drive_name]:         ex. 'd:' or 'e:' or 'q:'");
		puts ("  -l or -L              for LCON.");
		puts ("  -c or -C              to do quick start.");
		puts ("  -lc or -cl            multiplex options.");
		puts ("           ファイルの拡張子を忘れないでね〜(⌒.⌒♪");
		puts ("           V.1.06a programed by Radis/ with AAZ･soft");
		exit(-1); /* 異常終了 */
	}

	/*	lconが常駐してるかしてないか?	*/
	if (l == 1) {
		call_b(0x80);
		if (r.h.ah != 0) {
			puts ("lconちゃうでぇ(^^;");
			l = 0;
		}
	}
	
	if2_check(f_name,drv); /* 実際の実行関数へと移動 */
	
	if( c == 0)
		puts("ふつーにおわったお ⌒.⌒♪");
	else
		puts("ｵﾜｯﾀﾖ〜 ♪⌒､⌒♪");
}

void if2_check(char f_name[], char drv[])
{
	char * p;
	char if2_file[128];
	FILE *tmpstr;
	char ex_1[4],ex_2[4];  /* 拡張子用の配列 */
	int i;
	
	/* 入力ファイルの拡張子の取得 */
	for( i = 0; '\0' != *(f_name+i); i++);
	for( ; '.' != *(f_name+i); i--);
		p = f_name+i;
	
	memmove( ex_1, p+1, 3);
	ex_1[3] = '\0';
	
	memmove( drv+2, "\\TMENU.IF2", 11);
	drv[13] = '\0';
	
	if ((tmpstr = fopen(drv,"r")) == NULL)
	{
		puts("ファイルが開けへんかったわ ごめんね");
		if ( l == 1) {
			call_b(0x80);
			if (r.h.ah != 0)
				puts ("エラ〜だモン！ [ah=30h:al=80h]");
		}
		exit(1);
	}
	
	for ( ; fgets( if2_file, 128, tmpstr); )
	{
		memmove( ex_2, if2_file, 3); /* TMENU.IF2からの拡張子の取得 */
		ex_2[3] = '\0';
		for ( i = 3; i > 0; i--)
			if( *(ex_2+i) == ' ')		*(ex_2+i) = '\0';
		
		if ( 0 == memicmp(ex_1,ex_2,3)) /*拡張子の比較 大文字小文字の区別なし*/
		{
			fclose(tmpstr);
			if2_exec(if2_file,f_name);
			return;
		}
		else 
			continue;
	}
}

void if2_exec(char if2_file[], char f_name[])
{
	int i = 0,f,n,hi=0,sw=0;
	char buff[128],tmp[128] = "RUN386.EXE ";
	char con[32], *str1 = "if2 V.1.06a :拡張画面サイズ(80 x ";
	
	for ( i=10, f=0; '\n' != *(if2_file+i); i++, f++);
		memmove( buff, if2_file+10, f);
	
	buff[f] = ' '; /* ファイル名の連結がうまくいくおまじない｡ */
	
	for( i = 0; '\0' != *(f_name+i); i++);
	memmove( buff+f+1, f_name, i); /*ファイル名の付加*/
	
	if ( l == 1) {
		call_b(0x40);
		hi = r.h.dh;
		
		if ( c == 0)
		{
			memmove( str1+ 32, itoa( hi, con, 10), 2);
			memmove( str1+ 34, ")", 2);
			puts(str1);
		}
	}
	else if ( c == 0)	puts("if2 V.1.06a : ");
	
	if ( *(if2_file+5) == '0') /* EXE,COM,BAT のチエック ﾈｲﾃｨﾌﾞ用*/
	{
		for( i = 0; '\0' != *(buff+i); i++);
		memmove( tmp+11, buff, i);
		
		if ( l != 1 && c == 0)
		{
			str1 = "File : ";
			memmove( str1 + 7, tmp, i+11);
			*(str1+8+i+10) = '\0';
			puts(str1);
		}
		
		/* ウェイト 速すぎるとファイル名が表示されないため */
		if ( c == 0)		t_wait();
		
		/*	変更箇所１	*/
		if ( l == 1) {
			sw = 1;
			scr_clear(sw);
		}
		
		system(tmp); /* 起動するはず･･･ */
		
		/* ｳｪｲﾄ 速すぎて文字表示の復帰が間に合わないことがあるため */
		if ( c == 0)	t_wait();
		
		if ( l == 1) {
			sw = 2;
			scr_clear(sw);
			text_undo();
		}
		return;
	}
	else if( *(if2_file+5) == '1') /* こちらがリアルモード用の処理 */
	{
		for ( i = 0; *(buff+i) != ' '; i++)
		{
			*(con+i) = *(buff+i); /* console.exe が有るかどうかの処理のため */
		}
		/* CONSOLE.EXE や ORICON.EXE を抜く */
		if ( 0 == memicmp("d:\\console.exe",con,15))
		{
			for ( i = 10;; i++) 
			{
				if ( *(buff+i) == ' ' && *(buff+i+2) == ':')
				{
					for( n = i+1, f = 0; *(buff+n) != '\0'; n++, f++)
						*(tmp+f) = *(buff+n);
					*(tmp+f) = '\0';
					break;
				}
			}
			i = f;
		}
		else /* console.exe が無かったときの処理 */
			memmove( tmp, buff, i = sizeof(buff));
		
		if ( c == 0) /* ファイル名の表示 */
		{
			str1 = "File : ";
			memmove( str1 + 7, tmp, i);
			*(str1+8+i) = '\0';
			puts(str1);
		}
		
		/*	変更箇所２　*/
		if ( l == 1) {
			sw = 1;
			scr_clear(sw);
		}
		system(tmp);
		
		if ( l == 1) {
			sw = 2;
			scr_clear(sw);
			text_undo();
		}
		return;
	}
}

/*	こっからが新たに追加した関数	*/
/*	Text-VRAM 退避用スタック初期化 & 退避

	(テキストvram退避&復帰は現在のif2.exeではハッキリ言ってあんまり意味が
	 ないと思う。　理由は、単にsystem関数で呼出し実行しているため(^^;)
*/
void text_init()
{
	int	er1=0, er2=0;

	call_b(0x00);
	er1 = r.h.ah;
	call_b(0x01);
	er2 = r.h.ah;
	if ((er1 || er2) != 0)
		puts ("エラ〜！");
}

/*	Text-VRAM スタックの復帰	*/
void text_undo()
{
	call_b(0x02);
	call_b(0x05);		/* 文字を再描画する	*/
	if (r.h.ah != 0)
		puts ("エラ〜！");
}

/*	文字描画の禁止 & 再開 と コンソ〜ル画面初期化	*/
void scr_clear(int sw)
{
	int	er1=0, er2=0;

	if (sw == 1) {
		call_b(0x04);				/*	文字描画禁止 (lcon S)	*/
		er1 = r.h.ah;
	}
	else if (sw == 2) {
			call_b(0x03);			/*	文字描画再開	*/
			er2 = r.h.ah;
	}
	call_b(0x80);					/*	コンソ〜ル画面初期化	*/
	if ((er1 || er2 || r.h.ah) != 0)
		puts ("エラ〜！");
}

void t_wait() /* ウェイト…これも意味のないものﾀﾞﾜ(^^; */
{
	clock_t start = clock()/CLOCKS_PER_SEC;
	clock_t duration = 0;
	
	while(((clock()/CLOCKS_PER_SEC) - start)*2 <= duration);
}

void call_b(int x)
{
	r.h.ah = 0x30;
	r.h.al = x;
	int86 (0x91, &r, &r);
}

int options( char **argv)
{
		if ( 'l' == *(*(argv+1)+1) || 'L' == *(*(argv+1)+1) )
		/* ｵﾌﾟｼｮﾝ -l があるか */
		{
			l = 1;
			if ( ('c' == *(*(argv+1) + 2) ) || ( 'C' == *(*(argv+1) + 2) ) )
				/* -c を含んでいるか… */
				c = 1;
			return 0;
		}
		else if ( 'c' == *(*(argv+1)+1) || 'C' == *(*(argv+1)+1) )
		/* 先ず ｵﾌﾟｼｮﾝ -c があるか確かめてから､ -l も含んでいるか… */
		{
			c = 1;
			if ( 'l' == *(*(argv+1)+2) || 'L' == *(*(argv+1)+2) )
				l = 1;
			return 0;
		}
		else return 1;
}
