/*
 *	clipdirs.h
 *
 *	演出シーケンサ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015-2018 Naoyuki Sawa
 *
 *	* Sun Feb 08 19:01:54 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Thu Apr 23 21:42:53 JST 2015 Naoyuki Sawa
 *	- DirSeq_Stop(),DirSeqCh_Stop()を追加しました。
 *	  演出テーブルをクリアせずに、現在実行中の演出シーケンスを停止したい場合に使用します。
 *	  例えば、'あるトリガ'から??秒後に'ある表示'を行うような演出シーケンスを開始した後に、何らかの条件でその予約を取り消す場合等です。
 *	* Tue May 05 17:15:43 JST 2015 Naoyuki Sawa
 *	- DirSeqCh_SetTblNo()を追加しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'～'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Sun Nov 22 21:02:41 JST 2015 Naoyuki Sawa
 *	- DirTrg_setとDirTrg_clrのシンボル定義を追加しました。
 *	  2015/11/20のdDirSeqC.exeの変更により、DirTrg_setとDirTrg_clr以外のトリガ番号のシンボルはdDirSeqC.exeが出力するようになりました。
 *	  dDirSeqC.exeが出力しない固定のトリガ番号のシンボルのみ、当モジュール内で定義する事にしました。
 *	* Tue Aug 02 22:11:15 JST 2016 Naoyuki Sawa
 *	- 演出実行関数(fnAct)の引数仕様を変更しました。
 *	  【変更前】void fnAct(int ActNo);				ActNo = [31]=オーバーフロー,[30:24]=未定義,[23:0]=演出番号
 *	  【変更後】void fnAct(int iCh, int ActNo, int bOverFlow);	iCh = 演出シーケンサチャネル番号, ActNo = 演出番号, bOverFlow = オーバーフロー
 *	- 今回の変更により、演出実行関数に演出シーケンサチャネル番号も通知されるようになりました。
 *	  アプリケーション側で、演出シーケンサチャネル番号も参照して、演出実行処理を行えるようになりました。
 *	- 今回の変更のために、演出番号バッファ(ST_DirSeq.pActBuf)をスタックフレーム上に確保するサイズが増加しました。(clipdirs.cの_DirSeq_SetActBuf())
 *	  (DirSeq_ActBufSize=256)の場合、変更前は(256×3)=768バイトだったのに対し、変更後は(256×4)=1024バイトになりました。
 *	  アプリケーションのMakefileにて、スタックサイズを十分確保するよう、注意して下さい。
 *	* Fri Sep 09 21:13:53 JST 2016 Naoyuki Sawa
 *	- 演出シーケンサを、複数インスタンスに対応しました。
 *	  当モジュールの関数を呼び出している既存のアプリケーションも、修正が必要になります。
 *	  変更点は、以下の通りです:
 *	  ①clipdirs.cのローカル変数stDirSeqを廃止しました。
 *	    │今後は、アプリケーション側でST_DirSeq構造体のメモリを確保するか、ST_DirSeq型のグローバル変数を定義して下さい。
 *	  ②既存の各関数に、pDirSeq引数を追加しました。
 *	    │上記で確保したST_DirSeqインスタンスのポインタを、pDirSeq引数に指定して下さい。
 *	  ③演出実行関数(fnAct)に、pDirSeq引数を追加しました。
 *	    │どの演出シーケンサのインスタンスから呼び出されたかを、判断するための引数です。
 *	    │例えば、一つのオブジェクトに一つの演出シーケンサを関連付ける場合は、オブジェクトの中にST_DirSeq構造体を埋め込んでCONTAINING_RECORD()を使うか、又は、g_dataset_set_data()等でアドレスを関連付けて下さい。
 *	- 今回の変更と一緒に、ロックバッファサイズ(DirSeqCh_LockBufSize),スタッサイズ(DirSeqCh_StackSize),演出シーケンサチャネル番号の最大値(DirSeqCh_Max)等も、
 *	  定数ではなく、実行時に各インスタンス毎に指定出来るようにしようかとも考えたのですが、やっぱり、今回はそれは行わない事にしました。
 *	  一度に変更すると、変更箇所が多すぎて、デバッグが難しくなると思ったからです。
 *	  まずは、今回の変更が安定して動作する事を確認してから、上記の変更も行いたいと思います。							⇒{{2016/09/10コメント追記:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。}}
 *	  特に、今回、複数インスタンスに対応した事によって、各インスタンスの演出シーケンサチャネル番号の最大値(DirSeqCh_Max)はもっと少なくて済むようになった可能性が高いので、
 *	  演出シーケンサチャネル番号の最大値(DirSeqCh_Max)を、定数でなく、実行時に各インスタンス毎に指定出来るようにする変更を、優先して行うべきです。	⇒{{2016/09/10コメント追記:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。}}
 *	* Sat Sep 10 21:46:35 JST 2016 Naoyuki Sawa
 *	- 演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
 *	  この変更を行った理由については、clipdirs.hの'Fri Sep 09 21:13:53 JST 2016'のコメントを参照して下さい。
 *	* Mon Sep 12 21:10:58 JST 2016 Naoyuki Sawa
 *	- 演出シーケンスが動作中であるかを取得する関数を追加しました。
 *	* Fri May 12 09:53:14 JST 2017 Naoyuki Sawa
 *	- これまでにコメントアウトして残していた変更前のコードを、全て削除しました。
 *	  変更前のコードを参照する必要が生じた場合は、前回のアーカイブを参照して下さい。
 *	  近々、個々の演出シーケンサチャネル内で複数のコンテキストを同時に実行出来るようにする変更を行う予定なので、そのために一旦ソース整理して単純化するためです。
 *	  今回はコメントを削除しただけで、処理は変更していないので、まだ動作は変わっていません。
 *	* Sat May 13 21:44:35 JST 2017 Naoyuki Sawa
 *	- fork命令を追加しました。
 *	  一つのチャネルの中で、複数のコンテキストを同時進行出来るようになりました。
 *	- 今回の変更は、当モジュール内の処理としては大幅な変更でしたが、アプリケーション関数の仕様変更は有りません。
 *	  新しいfork命令を使用しなければ、既存のアプリケーションには影響有りません。
 *	* Tue May 23 23:35:30 JST 2017 Naoyuki Sawa
 *	- hide命令を追加しました。
 *	  当該チャネルにコンテキストが残っていても、DirSeq_GetStat(),及び,DirSeqCh_GetStat()の観点からは、当該チャネルが停止中であるように見せかけるための命令です。
 *	  この命令を追加した理由は、以下の通りです。
 *	- forkとrepeatを使って、副次的な演出の無限ループを組みたい事が時々有ります。
 *	  □スクリプトの例
 *	  │	Test1
 *	  │	  fork					//┐
 *	  │	    repeat				//│
 *	  │	      TapLogCh_Play_(Se1,左足の音)	//│
 *	  │	      wait SEC(1.0)			//│一秒ごとに足音を鳴らす無限ループ
 *	  │	      TapLogCh_Play_(Se1,右足の音)	//│
 *	  │	      wait SEC(1.0)			//│
 *	  │	    end					//│
 *	  │	  end					//┘
 *	  │	  act 道を歩く
 *	  │	  wait SEC(3.0)
 *	  │	  act 建物の中へ入って行く
 *	  │	  wait SEC(3.0)
 *	  │	end
 *	  プログラム側では、DirSeqCh_GetStat()を使って、この演出の完了を待ちます。
 *	  しかし実際には、この演出は完了しません。
 *	  最初に開始したコンテキストが6秒間で完了した後も、足音を鳴らすコンテキストが無限ループで実行され続けているからです。
 *	  これまでは、上記のような演出を行うためには、サウンド自体をループにしてforkを使わないようにする等の方法を取らざるを得ず、forkが充分に活用出来ませんでした。
 *	- そこで今回、hide命令を追加して、hide命令を実行したコンテキストは、DirSeqCh_GetStat()の観点からは存在しないように見せかける事にしました。
 *	  変更後のスクリプトは、以下のようになります。
 *	  □スクリプトの例
 *	  │	Test1
 *	  │	  fork					//┐
 *	  │	    hide	//←───────────│──────注目!!
 *	  │	    repeat				//│
 *	  │	      TapLogCh_Play_(Se1,左足の音)	//│
 *	  │	      wait SEC(1.0)			//│一秒ごとに足音を鳴らす無限ループ
 *	  │	      TapLogCh_Play_(Se1,右足の音)	//│
 *	  │	      wait SEC(1.0)			//│
 *	  │	    end					//│
 *	  │	  end					//┘
 *	  │	  act 道を歩く
 *	  │	  wait SEC(3.0)
 *	  │	  act 建物の中へ入って行く
 *	  │	  wait SEC(3.0)
 *	  │	end
 *	  プログラム側の変更は不要で、DirSeqCh_GetStat()を使えば、足音を鳴らすコンテキスト(hideを実行したコンテキスト)が無限ループで残っていても、最初に開始したコンテキスト(hideを実行していないコンテキスト)が完了すれば、当該チャネルは完了したと判断されます。
 *	  尚、forkで開始したコンテキストでしかhideが使えないと言う訳ではなく、最初に開始したコンテキストでhideを実行すれば最初に開始したコンテキストが隠れコンテキストとなります。
 *	  また、上記のスクリプトの例ではforkの直後でhideを実行していますが必然ではなく、途中でhideを呼び出しても構いません。直観通り、hideを呼び出すまでは通常コンテキストで、hideを呼び出した時点から隠れコンテキストとなります。
 *	- 実装上の注意点として、もし今後当モジュールの処理を変更する場合、当モジュールの内部からは、DirSeqCh_GetStat()を使って当該チャネルが停止しているかどうかを判断してはいけません。
 *	  隠れコンテキストが残っていても当該チャネルを停止と見なして良いのは、あくまでもアプリケーションの観点からのみであり、当モジュールの実行処理(DirSeq_Exec())や停止処理(DirSeq_Stop())の観点からは、隠れコンテキストも通常のコンテキストと同様に、実行,及び,停止がなされなければならないからです。
 *	  現在の所、当モジュールの内部処理でDirSeqCh_GetStat()を使用している箇所は無いので問題ありませんが、今後当モジュールの処理を変更する場合も、エンバグしないように注意して下さい。
 *	* Wed May 24 21:26:30 JST 2017 Naoyuki Sawa
 *	- fork命令で開始したコンテキストは、元コンテキストの隠れコンテキストフラグを継承するようにしました。
 *	  変更した理由は、以下の通りです。
 *	- 変更前は、fork命令で開始したコンテキストも含めて、全てのコンテキストは初期状態で'通常のコンテキスト'(=隠れコンテキストではない)としていました。
 *	  しかしそれでは、既に隠れコンテキストであるコンテキストがfork命令を実行して新たなコンテキストを開始した場合に、問題が生じる可能性が有る事に気付きました。
 *	  例えば、以下のようなケースです。
 *	  当該チャネルに属するコンテキストが全て隠れコンテキストである場合、アプリケーションの観点からは(=DirSeq_GetStat(),及び,DirSeqCh_GetStat()の観点からは)、そのチャネルは擬似的に停止中と見なします。
 *	  その後、隠れコンテキストがfork命令を実行した場合、(昨日までの動作では)開始した新たなコンテキストが通常コンテキストなので、そのチャネルが動作中に戻る事になってしまっていました。
 *	  アプリケーションの観点から、停止中のチャネルが能動的に動作中に戻るのは明らかに不自然であり、DirSeq_GetStat()やDirSeqCh_GetStat()を呼び出すタイミングによって結果が予測し辛い問題を生じてしまいます。
 *	- 昨日の動作のままで上記の問題を回避することも、一応は可能でした。
 *	  隠れコンテキストのfork命令で開始したブロックは、必ず先頭でhideするようにスクリプトで明示的に指定する事です。
 *	  とは言え、スクリプトの全ての部分について隠れコンテキストであるかどうかを認識して組むのは管理が困難ですし、もしhideを書き忘れた場合に見つけ辛いバグとなる恐れが有ります。
 *	  だいたい、隠れコンテキストがなんらかの処理を行うためにfork命令で別のコンテキストを生成したい場合、そのコンテキストも隠れコンテキストとしたいであろう事はまず間違いないと思うので、利便性の観点からも明示的にhideを書く必要が有るのは問題が有ります。
 *	- そこで本日、動作を変更して、隠れコンテキストがfork命令で開始したコンテキストは、初期状態で隠れコンテキストとする事にしました。
 *	  要するに、fork命令で開始したコンテキストは、元コンテキストの隠れコンテキストフラグを継承するようにしました。
 *	  もう、前述の、擬似的に停止中になったチャネルが能動的に動作中に戻るような、望ましくない動作が発生する心配は有りません。
 *	  また、隠れコンテキストがfork命令で新たなコンテキストを開始した後に、そのコンテキストで明示的にhide命令を書く必要も有りません。
 *	  今回の変更によって、変更前よりも直観的な動作になったと思うので、変更後の動作について特に意識する必要は無いと思います。
 *	- 尚、今回の変更はあくまでもスクリプト内でfork命令によって開始したコンテキストに関するものであり、DirSeqCh_SendTrig()等によってプログラムから明示的に開始したコンテキストが初期状態で'通常のコンテキスト'(=隠れコンテキストではない)である点については、これまでと変わりません。
 *	* Tue Jun 20 21:14:16 JST 2017 Naoyuki Sawa
 *	- join命令を追加しました。
 *	  自分以外の全てのコンテキストが終了するまで待ちます。
 *	  詳細は、_DirSeqCtx_Exec1()内の、join命令を処理している箇所のコメントを参照して下さい。
 *	- join命令を追加した理由は、主コンテキストが複数の副コンテキストを起動し、全ての副コンテキストの終了を待って(=同期して)次へ進むような処理を、記述し易くしたいと思ったからです。(尚、当モジュールの機能自体には、主コンテキスト・副コンテキストという概念は有りません。説明上の、コンテキストの役割としての主・副と理解して下さい。)
 *	  □スクリプトの例
 *	  │	Test1
 *	  │	  fork				//一つ目の副コンテキストを起動する。
 *	  │	    repeat 3
 *	  │	      TapLogCh_Play_(Se1,Foo)
 *	  │	      wait SEC(1.0)
 *	  │	    end
 *	  │	  end
 *	  │	  fork				//二つ目の副コンテキストを起動する。
 *	  │	    repeat 5
 *	  │	      TapLogCh_Play_(Se2,Bar)
 *	  │	      wait SEC(0.7)
 *	  │	    end
 *	  │	  end
 *	  │	  fork				//三つ目の副コンテキストを起動する。
 *	  │	    repeat 7
 *	  │	      TapLogCh_Play_(Se3,Baz)
 *	  │	      wait SEC(0.3)
 *	  │	    end
 *	  │	  end
 *	  │	  join				//全ての副コンテキストが終了するのを待つ。
 *	  │	  TapLogCh_Play_(Se1,Qux)
 *	  │	end
 *	  上記の例の場合、一つ目の副コンテキストは3.0秒、二つ目の副コンテキストは3.5秒、三つ目の副コンテキストは2.1秒掛かりますから、
 *	  │	  ～前略～
 *	  │	  wait SEC(3.5)
 *	  │	  TapLogCh_Play_(Se1,Qux)
 *	  │	end
 *	  と書いても同じではあるのですが、主コンテキストが明示的にwaitで待つよりも、joinで待つ方がスクリプトが読み易いという利点が有ります。
 *	  また、もし、副コンテキストのタイミングを調整して、別の副コンテキストの時間が一番長くなった場合でも、主コンテキストの処理を書き換えなくても良いという利点が有ります。
 *	* Sun Sep 03 23:36:18 JST 2017 Naoyuki Sawa
 *	- if命令を追加しました。
 *	  □スクリプトの例
 *	  │	Test1
 *	  │	  if Cond1
 *	  │	    act  条件'Cond1'が成立した場合だけ実行する演出
 *	  │	    wait SEC(1.0)
 *	  │	  end
 *	  │	  act    常に実行する演出
 *	  │	end
 *	* Sun Oct 29 23:41:29 JST 2017 Naoyuki Sawa
 *	- ロックバッファのロジックにバグが見つかりましたが、修正していません。
 *	  詳細は、clipsnrs.cの同日のコメントを参照して下さい。
 *	* Tue Apr 10 23:59:59 JST 2018 Naoyuki Sawa
 *	- 雛形プロジェクトでの演出シーケンサ使用を廃止し、シナリオシーケンサへ移行しました。
 *	  演出シーケンサのモジュール(clipdirs.h,clipdirs.c)は、ソースを参考にする時のためにビルドに含めて残してあります。
 *	  ただし、雛形プロジェクト(test.pce,test.win,test.x64)からは完全に削除したので、今後、使用する事は無いと思います。
 *	  もしまた、演出シーケンサを使用する必要が生じた場合は、前回までのアーカイブ内の雛形プロジェクトを参照して下さい。
 */
#ifndef __CLIP_DIRS_H__
#define __CLIP_DIRS_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
//□命令仕様
//
//	#--- 疑似命令 ---
//	[def] ﾗﾍﾞﾙ名
//	#--- 共通命令 ---
//	end							#00000000
//	#--- 演出ｼｰｹﾝｽ命令 ---
//	join							#00010000
//	hide							#00010001
//	repeat							#00010010 11111111							┐
//	repeat 繰り返し回数					#00010010 uuuuuuuu							┴u:繰返し回数			0=不可(ｴﾗｰ停止),1~254=繰返し回数,255=無限｡
//	wait   待ち時間						#00010011 uuuuuuuu uuuuuuuu						─u:待ち時間			0=不可(ｴﾗｰ停止),1~65535=待ち時間｡
//	call   相対位置						#00010100 ssssssss ssssssss ssssssss					─s:相対位置			次の命令の位置を基準とする｡
//	fork   相対位置						#00010101 ssssssss ssssssss ssssssss					─s:相対位置			次の命令の位置を基準とする｡
//	act    演出番号						#00010110 uuuuuuuu uuuuuuuu uuuuuuuu					┬u:演出番号			ｱﾌﾟﾘｹｰｼｮﾝ定義の任意の24ﾋﾞｯﾄ値｡
//	act    演出番号 flush					#00010111 uuuuuuuu uuuuuuuu uuuuuuuu					┘
//	if     条件番号 相対位置				#00011010 uuuuuuuu uuuuuuuu uuuuuuuu ssssssss ssssssss ssssssss		─u:条件番号,s:相対位置		次の命令の位置を基準とする｡				//{{2017/09/03追加:if命令を追加しました。}}
//	#--- 演出ﾃｰﾌﾞﾙ命令 ---
//	on ﾄﾘｶﾞ番号        [goto] ﾗﾍﾞﾙ名               		#00100000 uuuuuuuu ssssssss ssssssss ssssssss 00000000 00000000		┐u=ﾄﾘｶﾞ番号			0~255=ﾄﾘｶﾞ番号｡0は'set',255は'clr'でも可｡
//	on ﾄﾘｶﾞ番号        [goto] ﾗﾍﾞﾙ名 [lock] ﾛｯｸ時間		#00100000 uuuuuuuu ssssssss ssssssss ssssssss vvvvvvvv vvvvvvvv		┼s=相対位置			次の命令の位置を基準とする｡
//	on ﾄﾘｶﾞ番号 unlock [goto] ﾗﾍﾞﾙ名               		#00100001 uuuuuuuu ssssssss ssssssss ssssssss 00000000 00000000		┤v=ﾛｯｸ時間			0=ﾛｯｸしない,1~65535=ﾛｯｸ時間｡
//	on ﾄﾘｶﾞ番号 unlock [goto] ﾗﾍﾞﾙ名 [lock] ﾛｯｸ時間		#00100001 uuuuuuuu ssssssss ssssssss ssssssss vvvvvvvv vvvvvvvv		┘
//
/*--------------------------------------------------------------------------*/
//□命令コード定義用マクロ
//--- 共通命令 ---
#define DirSeq_Inst_end				0x00
//--- 演出ｼｰｹﾝｽ命令 ---
#define DirSeq_Inst_join			0x10
#define DirSeq_Inst_hide			0x11
#define DirSeq_Inst_repeat			0x12
#define DirSeq_Inst_wait			0x13
#define DirSeq_Inst_call			0x14
#define DirSeq_Inst_fork			0x15
#define DirSeq_Inst_act				0x16
#define DirSeq_Inst_act_flush			0x17
#define DirSeq_Inst_if				0x18																						//{{2017/09/03追加:if命令を追加しました。}}
//--- 演出ﾃｰﾌﾞﾙ命令 ---
#define DirSeq_Inst_on_goto_lock		0x20
#define DirSeq_Inst_on_unlock_goto_lock		0x21
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
//--- 共通命令 ---
#define DirSeq_Inst_end_()			DirSeq_Inst_end
//--- 演出ｼｰｹﾝｽ命令 ---
#define DirSeq_Inst_repeat_(u)			DirSeq_Inst_repeat,   ((uint8_t)(u))
#define DirSeq_Inst_wait_(u)			DirSeq_Inst_wait,     ((uint8_t)(u)),((uint8_t)((u)>>8))
#define DirSeq_Inst_call_(s)			DirSeq_Inst_call,     ((uint8_t)(s)),((uint8_t)((s)>>8)),((uint8_t)((s)>>16))
#define DirSeq_Inst_fork_(s)			DirSeq_Inst_fork,     ((uint8_t)(s)),((uint8_t)((s)>>8)),((uint8_t)((s)>>16))
#define DirSeq_Inst_act_(u)			DirSeq_Inst_act,      ((uint8_t)(u)),((uint8_t)((u)>>8)),((uint8_t)((u)>>16))
#define DirSeq_Inst_act_flush_(u)		DirSeq_Inst_act_flush,((uint8_t)(u)),((uint8_t)((u)>>8)),((uint8_t)((u)>>16))
#define DirSeq_Inst_if_(u,s)			DirSeq_Inst_if,       ((uint8_t)(u)),((uint8_t)((u)>>8)),((uint8_t)((u)>>16)),((uint8_t)(s)),((uint8_t)((s)>>8)),((uint8_t)((s)>>16))						//{{2017/09/03追加:if命令を追加しました。}}
//--- 演出ﾃｰﾌﾞﾙ命令 ---
#define DirSeq_Inst_on_lock_(            u,  v)	DirSeq_Inst_on_goto_lock_(       u,0,v)
#define DirSeq_Inst_on_goto_(            u,s  )	DirSeq_Inst_on_goto_lock_(       u,s,0)
#define DirSeq_Inst_on_goto_lock_(       u,s,v)	DirSeq_Inst_on_goto_lock,       ((uint8_t)(u)),((uint8_t)(s)),((uint8_t)((s)>>8)),((uint8_t)((s)>>16)),((uint8_t)(v)),((uint8_t)((v)>>8))
#define DirSeq_Inst_on_unlock_(          u    )	DirSeq_Inst_on_unlock_goto_lock_(u,0,0)
#define DirSeq_Inst_on_unlock_lock_(     u,  v)	DirSeq_Inst_on_unlock_goto_lock_(u,0,v)
#define DirSeq_Inst_on_unlock_goto_(     u,s  )	DirSeq_Inst_on_unlock_goto_lock_(u,s,0)
#define DirSeq_Inst_on_unlock_goto_lock_(u,s,v)	DirSeq_Inst_on_unlock_goto_lock,((uint8_t)(u)),((uint8_t)(s)),((uint8_t)((s)>>8)),((uint8_t)((s)>>16)),((uint8_t)(v)),((uint8_t)((v)>>8))
/*--------------------------------------------------------------------------*/
#define DirSeqCtx_StackSize	  3	//スタッサイズ				1～255で調整可		調整可ではあるがアプリケーション毎に調整する事は想定していない。変更する場合はライブラリをリビルドせよ。
//演出シーケンサコンテキスト
typedef struct _ST_DirSeqCtx {
	const uint8_t*		pDirSeq;					//+ 0, 4   演出シーケンスの次に実行する命令位置		NULL=空き
	uint16_t		WaitCnt;					//+ 4, 2   残り待ち時間																(pDirSeq==NULL)ならば、(WaitCnt==0)とします。		処理上必須ではありませんが、メモリ破壊やバグ検出のためです。詳細は、_DirSeq_AllocDirSeqCtx(),及び,_DirSeq_FreeDirSeqCtx()のコメントを参照して下さい。
	uint8_t			iCtxNext;					//+ 6, 1   コンテキストチェイン				0～254=このチャネルのコンテキストチェインの次のコンテキストのインデクス,255=終端	(pDirSeq==NULL)ならば、(iCtxNext==255)とします。	処理上必須ではありませんが、メモリ破壊やバグ検出のためです。詳細は、_DirSeq_AllocDirSeqCtx(),及び,_DirSeq_FreeDirSeqCtx()のコメントを参照して下さい。
	uint8_t			bHide;						//+ 7, 1   隠れコンテキストフラグ			0=通常のコンテキスト,1=隠れコンテキスト							(pDirSeq==NULL)ならば、(bHide==0)とします。		処理上必須ではありませんが、メモリ破壊やバグ検出のためです。詳細は、_DirSeq_AllocDirSeqCtx(),及び,_DirSeq_FreeDirSeqCtx()のコメントを参照して下さい。
	//--- スタック ---
	uint8_t			StackLev;					//+ 8, 1   スタックレベル															(pDirSeq==NULL)ならば、(StackLev==0)とします。		処理上必須ではありませんが、メモリ破壊やバグ検出のためです。詳細は、_DirSeq_AllocDirSeqCtx(),及び,_DirSeq_FreeDirSeqCtx()のコメントを参照して下さい。
	uint8_t			TBL_StackRep[DirSeqCtx_StackSize];		//+ 9, 1*3 0=Callスタック,1～254=Repeatスタックの残り繰返し回数,255=Repeatスタック(無限)
	const uint8_t*		TBL_StackRet[DirSeqCtx_StackSize];		//+12, 4*3 戻り先の命令位置							call,又は,repeatの次の命令を指す
} ST_DirSeqCtx;									//=24
/*--------------------------------------------------------------------------*/
#define DirSeqCh_LockBufSize	  3	//ロックバッファサイズ			1～   で調整可		調整可ではあるがアプリケーション毎に調整する事は想定していない。変更する場合はライブラリをリビルドせよ。
//演出シーケンサチャネル
typedef struct _ST_DirSeqCh {
	const uint8_t*		pDirTbl;					//+ 0, 4   現在設定されている演出テーブル		NULL=無し
	uint8_t			iCtxHead;					//+ 4, 1   コンテキストチェイン				0～254=このチャネルのコンテキストチェインの最初のコンテキストのインデクス,255=終端
	//									//+ 5, 1   (パディング)
	//--- ロック ---
	uint16_t		LockCnt;					//+ 6, 2   残りロック時間
	const uint8_t*		TBL_LockBuf[DirSeqCh_LockBufSize];		//+ 8, 4*3 ロック終了を待っている演出シーケンス		NULL要素で終端		'on'命令の3バイト目を指す
} ST_DirSeqCh;									//=20
/*--------------------------------------------------------------------------*/
#define DirSeq_ActBufSize	256	//演出番号バッファサイズ		1～65535で調整可	調整可ではあるがアプリケーション毎に調整する事は想定していない。変更する場合はライブラリをリビルドせよ。
//演出シーケンサ
typedef struct _ST_DirSeq {
	void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow);	//+ 0, 4 演出実行関数へのポインタ
	int  (*fnCnd)(struct _ST_DirSeq* pDirSeq, int iCh, int CndNo);			//+ 4, 4 条件判断関数へのポインタ													//{{2017/09/03追加:if命令を追加しました。}}
	uint32_t*		pActBuf/*[DirSeq_ActBufSize]*/;			//+ 8, 4   演出番号バッファへのポインタ			_DirSeq_SetActBuf()にてスタック上に確保したバッファのポインタをバッファが有効な期間中のみST_DirSeq.pActBufに設定する。充分なサイズ,かつ,スタックが溢れないようにDirSeq_ActBufSizeを調整せよ。
	uint16_t		ActBufCnt;					//+12, 2   演出番号バッファの格納数
	uint16_t		ActBufPos;					//+14, 2   演出番号バッファの読出し位置
	uint8_t			nCh;						//+16, 1   演出シーケンサチャネル数
	uint8_t			nCtx;						//+17, 1   コンテキストバッファサイズ
	//									//+18, 2   (パディング)
    //	ST_DirSeqCh		TBL_DirSeqCh[nCh];				//+20,20*nCh
    //	ST_DirSeqCtx		TBL_DirSeqCtx[nCtx];				//+20+20*nCh,24*nCtx
} ST_DirSeq;									//=20+20*nCh+24*nCtx
/*--------------------------------------------------------------------------*/
#define DirTrg_set		  0	//'set'トリガ番号	┐0='set'と255='clr'は、_DirSeqCh_SetTbl()の動作仕様のため固定です。
#define DirTrg_clr		255	//'clr'トリガ番号	┘1～254はアプリケーション定義で、dDirSeqC.exeによって定義されます。
/****************************************************************************
 *	
 ****************************************************************************/
//演出シーケンサを初期化する。
//{{2017/09/03変更:if命令を追加しました。
//ST_DirSeq* DirSeq_New(void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow), int nCh, int nCtx);
//void DirSeq_Init(ST_DirSeq* pDirSeq, void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow), int nCh, int nCtx);
//↓2017/09/03変更:if命令を追加しました。
ST_DirSeq* DirSeq_New(void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow),
                      int  (*fnCnd)(struct _ST_DirSeq* pDirSeq, int iCh, int CndNo), int nCh, int nCtx);
void DirSeq_Init(ST_DirSeq* pDirSeq, void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow),
                                     int  (*fnCnd)(struct _ST_DirSeq* pDirSeq, int iCh, int CndNo), int nCh, int nCtx);
//}}2017/09/03変更:if命令を追加しました。
void DirSeq_Free(ST_DirSeq* pDirSeq);
//演出シーケンサを実行する。
void DirSeq_Exec(ST_DirSeq* pDirSeq);
//演出テーブルを設定,又は,クリアする。
void DirSeq_ClrTbl(ST_DirSeq* pDirSeq);
void DirSeqCh_SetTbl(ST_DirSeq* pDirSeq, int iCh, const uint8_t* pDirTbl/*NULL=クリア*/);
//トリガを送信する。
void DirSeq_SendTrig(ST_DirSeq* pDirSeq, int iTrig);
void DirSeqCh_SendTrig(ST_DirSeq* pDirSeq, int iCh, int iTrig);
//ロックを解除する。
void DirSeq_Unlock(ST_DirSeq* pDirSeq);
void DirSeqCh_Unlock(ST_DirSeq* pDirSeq, int iCh);
//演出シーケンスを停止する。
void DirSeq_Stop(ST_DirSeq* pDirSeq);
void DirSeqCh_Stop(ST_DirSeq* pDirSeq, int iCh);
//演出シーケンスが動作中であるかを取得する。
int DirSeq_GetStat(ST_DirSeq* pDirSeq);			//演出シーケンスが動作中であるチャネル数を返します。
int DirSeqCh_GetStat(ST_DirSeq* pDirSeq, int iCh);	//このチャネルが動作中ならば1、停止中ならば0を返します。
/****************************************************************************
 *	dDirSeqC.exeが出力したバイナリ形式を扱うためのユーティリティ関数
 ****************************************************************************/
#define USE_DIRSEQ_BIN	//ユーティリティ関数が不要ならばこのシンボル定義をコメントアウトしてください。
#ifdef  USE_DIRSEQ_BIN
void DirSeqCh_SetTblNo(ST_DirSeq* pDirSeq, int iCh, const void* pDirSeqBin, int iDirTblNo);
#endif//USE_DIRSEQ_BIN
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_DIRS_H__
