/*----------------------------------------------------------------------------
	IPX
----------------------------------------------------------------------------*/

#include "soh.h"
#include "ipx.h"

/*--------------------------------------------------------------------------*/
static long (*ixCommandTable[])(void) = {
	ixReserv		,				/* 0x00 : リザーブ						*/
	ixEnd			,				/* 0x01 : 自ジョブを終了する			*/
	ixLoadTex		,				/* 0x02 : テクスチャーロード			*/
	ixFreeTex		,				/* 0x03 : テクスチャー破棄				*/
	ixInitScr		,				/* 0x04 : スクロール初期化				*/
	ixSetInt		,				/* 0x05 : 割り込みテーブル設定			*/
	ixInt			,				/* 0x06 : 割り込み発生					*/
	ixGoto			,				/* 0x07 : ジャンプ						*/
	ixRndSeed		,				/* 0x08 : ランダムシード				*/
	ixParform		,				/* 0x09 : パフォーマンステスト			*/
	ixReserv		,				/* 0x0a : リザーブ						*/
	ixReserv		,				/* 0x0b : リザーブ						*/
	ixReserv		,				/* 0x0c : リザーブ						*/
	ixReserv		,				/* 0x0d : リザーブ						*/
	ixReserv		,				/* 0x0e : リザーブ						*/
	ixReserv		,				/* 0x0f : リザーブ						*/
	
	ixNop			,				/* 0x10 : 時間を1(sync)だけ経過させる	*/
	ixWait			,				/* 0x11 : 時間を指定割り込み経過させる	*/
	ixReserv		,				/* 0x12 : リザーブ						*/
	ixBra			,				/* 0x13 : 無条件分岐					*/
	ixBraTbl		,				/* 0x14 : テーブルによる分岐			*/
	ixFor			,				/* 0x15 : ループ開始位置				*/
	ixNext			,				/* 0x16 : ループ終了位置				*/
	ixCall			,				/* 0x17 : サブルーチンコール			*/
	ixRet			,				/* 0x18 : サブルーチンからリターン		*/
	ixTaskRun		,				/* 0x19 : タスク実行					*/
	ixTaskExit		,				/* 0x1a : 自タスクを終了する			*/
	ixTaskStop		,				/* 0x1b : タスク停止					*/
	ixTaskCont		,				/* 0x1c : 停止中のタスク再開			*/
	ixSyncEx		,				/* 0x1d : ＥＸシンクロ					*/
	ixReserv		,				/* 0x1e : リザーブ						*/
	ixReserv		,				/* 0x1f : リザーブ						*/
	
	ixMove			,				/* 0x20 : ワーク転送					*/
	ixCalc			,				/* 0x21 : ワーク演算					*/
	ixZero			,				/* 0x22 : ０なら分岐する				*/
	ixNZero			,				/* 0x23 : ０以外なら分岐する			*/
	ixIf			,				/* 0x24 : 条件分岐						*/
	ixGetWork		,				/* 0x25 : ゲットワーク					*/
	ixPutWork		,				/* 0x26 : プットワーク					*/
	ixReserv		,				/* 0x27 : リザーブ						*/
	ixChkStat		,				/* 0x28 : ステータスチェック			*/
	ixJchk			,				/* 0x29 : ジョイスティック判定			*/
	ixJchkS			,				/* 0x2a : ジョイスティック判定			*/
	ixReserv		,				/* 0x2b : リザーブ						*/
	ixColor			,				/* 0x2c : リザーブ						*/
	ixStatus		,				/* 0x2d : ステータス					*/
	ixGrp			,				/* 0x2e : パターン番号					*/
	ixPtn			,				/* 0x2f : グループ番号					*/
	
	ixNewJob		,				/* 0x30 : 新規ジョブ					*/
	ixDelJob		,				/* 0x31 : ジョブ消去					*/
	ixChkJob		,				/* 0x32 : ジョブチェック				*/
	ixPrio			,				/* 0x33 : 優先設定						*/
	ixPrioR			,				/* 0x34 : 優先設定						*/
	ixSyncOn		,				/* 0x35 : シンクロオン					*/
	ixSyncOff		,				/* 0x36 : シンクロオフ					*/
	ixNewObj		,				/* 0x37 : オブジェクト発生				*/
	ixEnemy			,				/* 0x38 : エネミー発生					*/
	ixReserv		,				/* 0x39 : リザーブ						*/
	ixShot1			,				/* 0x3a : 通常弾						*/
	ixShot2			,				/* 0x3b : 通常弾						*/
	ixLaser1		,				/* 0x3c : レーザー						*/
	ixLaser2		,				/* 0x3d : レーザー						*/
	ixHoming1		,				/* 0x3e : ホーミング発射				*/
	ixHoming		,				/* 0x3f : ホーミング					*/
	
	ixLink			,				/* 0x40 : リンクを張る					*/
	ixUnLink		,				/* 0x41 : リンクを解除					*/
	ixChkLink		,				/* 0x42 : リンクチェック				*/
	ixReserv		,				/* 0x43 : リザーブ						*/
	ixReserv		,				/* 0x44 : リザーブ						*/
	ixReserv		,				/* 0x45 : リザーブ						*/
	ixReserv		,				/* 0x46 : リザーブ						*/
	ixReserv		,				/* 0x47 : リザーブ						*/
	ixReserv		,				/* 0x48 : リザーブ						*/
	ixReserv		,				/* 0x49 : リザーブ						*/
	ixReserv		,				/* 0x4a : リザーブ						*/
	ixReserv		,				/* 0x4b : リザーブ						*/
	ixReserv		,				/* 0x4c : リザーブ						*/
	ixReserv		,				/* 0x4d : リザーブ						*/
	ixReserv		,				/* 0x4e : リザーブ						*/
	ixReserv		,				/* 0x4f : リザーブ						*/
	
	ixSetPos		,				/* 0x50 : 座標設定						*/
	ixSetPosXY		,				/* 0x51 : 座標設定						*/
	ixVecPos		,				/* 0x52 : 座標設定						*/
	ixVecPosXY		,				/* 0x53 : 座標設定						*/
	ixTarPos		,				/* 0x54 : 座標設定						*/
	ixTarPosXY		,				/* 0x55 : 座標設定						*/
	ixCntPos		,				/* 0x56 : 座標設定						*/
	ixCntPosXY		,				/* 0x57 : 座標設定						*/
	ixSetZoom		,				/* 0x58 : 座標設定						*/
	ixSetRoll		,				/* 0x59 : 座標設定						*/
	ixAddPos		,				/* 0x5a : 座標設定						*/
	ixAddPosXY		,				/* 0x5b : 座標設定						*/
	ixAddVec		,				/* 0x5c : 座標設定						*/
	ixAddVecXY		,				/* 0x5d : 座標設定						*/
	ixSetZ			,				/* 0x5e : 優先順位設定					*/
	ixReserv		,				/* 0x5f : リザーブ						*/
	
	ixAttRect		,				/* 0x60 : 攻撃判定の大きさ				*/
	ixDefRect		,				/* 0x61 : やられ判定の大きさ			*/
	ixAttAttr		,				/* 0x62 : 攻撃属性						*/
	ixDefAttr		,				/* 0x63 : やられ属性					*/
	ixGetRnd		,				/* 0x64 : 乱数取得						*/
	ixRndBra		,				/* 0x65 : 乱数分岐						*/
	ixFont			,				/* 0x66 : フォント						*/
	ixTarChk		,				/* 0x67 : ターゲットチェック			*/
	ixSetFade		,				/* 0x68 : セットフェード				*/
	ixFadeIn		,				/* 0x69 : フェードイン					*/
	ixFadeOut		,				/* 0x6a : フェードアウト				*/
	ixAddScore		,				/* 0x6b : スコア加算					*/
	ixDisp			,				/* 0x6c : 表示							*/
	ixChkNum		,				/* 0x6d : リザーブ						*/
	ixReserv		,				/* 0x6e : リザーブ						*/
	ixReserv		,				/* 0x6f : リザーブ						*/
	
	ixBornCreate	,				/* 0x70 : 多間接作成					*/
	ixBornFree		,				/* 0x71 : 多間接破棄					*/
	ixBornNum		,				/* 0x72 : 間接数						*/
	ixBornGrp		,				/* 0x73 : グループ						*/
	ixBornPtn		,				/* 0x74 : パターン						*/
	ixBornXAbs		,				/* 0x75 : Ｘ座標絶対					*/
	ixBornXRel		,				/* 0x76 : Ｘ座標相対					*/
	ixBornYAbs		,				/* 0x77 : Ｙ座標絶対					*/
	ixBornYRel		,				/* 0x78 : Ｙ座標相対					*/
	ixBornRollAbs	,				/* 0x79 : 角度絶対						*/
	ixBornRollRel	,				/* 0x7a : 角度相対						*/
	ixBornDistAbs	,				/* 0x7b : 距離絶対						*/
	ixBornDistRel	,				/* 0x7c : 距離相対						*/
	ixBornColor		,				/* 0x7d : カラー						*/
	ixBornRollTbl	,				/* 0x7e : 角度テーブル					*/
	ixReserv		,				/* 0x7f : リザーブ						*/
	
	ixSndLoad		,				/* 0x80 : サウンド読み込み				*/
	ixSndFree		,				/* 0x81 : サウンド開放					*/
	ixSndPlay		,				/* 0x82 : サウンド再生					*/
	ixMidPlay		,				/* 0x83 : ＭＩＤ再生					*/
	ixMidStop		,				/* 0x84 : ＭＩＤ停止					*/
	ixCddaPlay		,				/* 0x85 : CDDA再生						*/
	ixReserv		,				/* 0x86 : リザーブ						*/
	ixReserv		,				/* 0x87 : リザーブ						*/
	ixReserv		,				/* 0x88 : リザーブ						*/
	ixReserv		,				/* 0x89 : リザーブ						*/
	ixMeshPrio		,				/* 0x8a : Ｚ値							*/
	ixMeshCreate   	,				/* 0x8b : メッシュ作成					*/
	ixMeshFree    	,				/* 0x8c : メッシュ破棄					*/
	ixMeshMode    	,				/* 0x8d : モード設定					*/
	ixMeshClear    	,				/* 0x8e : クリア						*/
	ixMeshEffect   	,				/* 0x8f : エフェクト					*/
	
	ixSetUV			,				/* 0x90 : ＵＶ設定						*/
	ixDraw3			,				/* 0x91 : 三角形描画					*/
	ixDraw4			,				/* 0x92 : 四角形描画					*/
	ixPtCreate		,				/* 0x93 : パーティクル作成				*/
	ixPtFree		,				/* 0x94 : パーティクル消去				*/
	ixTrace			,				/* 0x95 : トレース設定					*/
	ixVibrate		,				/* 0x96 : 振動パック					*/
	ixReserv		,				/* 0x97 : リザーブ						*/
	ixReserv		,				/* 0x98 : リザーブ						*/
	ixReserv		,				/* 0x99 : リザーブ						*/
	ixReserv		,				/* 0x9a : リザーブ						*/
	ixReserv		,				/* 0x9b : リザーブ						*/
	ixReserv		,				/* 0x9c : リザーブ						*/
	ixReserv		,				/* 0x9d : リザーブ						*/
	ixReserv		,				/* 0x9e : リザーブ						*/
	ixReserv		,				/* 0x9f : リザーブ						*/
	
	ixLtCreate		,				/* 0xa0 : ライト作成					*/
	ixLtFree		,				/* 0xa1 : ライト破棄					*/
	ixLtInten		,				/* 0xa2 : ライト強度設定				*/
	ixLtDir			,				/* 0xa3 : ライト方向設定				*/
	ixLtRange		,				/* 0xa4 : ライトレンジ設定				*/
	ixLtOffset		,				/* 0xa5 : ライトオフセット設定			*/
};
/*--------------------------------------------------------------------------*/
long ixRun(void)
{
	long i;
	
	while (1) {
		i=ixCommandTable[ *ix->poi ]();
		switch (i>>28) {
		case 0x0:					/* IXD_NEXT 次の命令へ					*/
			ix->poi+=i&0xfffffff;
			break;
		case 0x1:					/* IXD_WAIT ウエイト後次の命令へ		*/
			ix->poi+=i&0xfffffff;
			return 0;
		case 0x2:					/* IXD_BRA 分岐後次の命令へ				*/
			ix->poi+=ix->ret;
			break;
		case 0x3:					/* IXD_JMP 分岐後次の命令へ				*/
			ix->poi=(u_char*)ix->ret;
			break;
		case 0x4:					/* IXD_EXIT 無条件終了					*/
			return (i&0xfffffff);
		case 0x5:					/* IXD_HALT 停止						*/
			ix->cnt=1;
			return 0;
		}
	}
}
/*--------------------------------------------------------------------------*/
long ixGetVal(long val)
{
	if (val<(long)0x80000100) {		/* ワークを取り出して返す				*/
		if ((val&0xff)<0x20)
			return OBJ(work[(u_long)val&0x1f]);
		else
			return 0;
	} else {						/* イミディエイトの場合はそのまま		*/
		return val;
	}
}
long ixGetValGET4(long gt)
{
	return ixGetVal(GET4(gt));		/* valをゲットしてから					*/
}
/*--------------------------------------------------------------------------*/
long ixGetLab(long lab)
{
	return (lab + (long)ix_buf + OFFS);		/* 相対ラベル計算				*/
}
long ixGetLabGET4(long lb)
{
	return ixGetLab(GET4(lb));		/* labをゲットしてから					*/
}
/*--------------------------------------------------------------------------*/
