/*
[tab:8]	form-script700:ver005:04/07/07:41568k

・概要
	SFC-CPUと同期を取り動作するような、.SPCファイル単体では再現(演奏)不能なシーケンス
	をサポートする簡易スクリプト（インタプリタ）
	.SPCファイル(SPC700)が期待する、SFC-CPUの動作内容を個別に定義する事で上記のタイプ
	のシーケンスでも正常な演奏を実現することが主な目的。


・動作の概略
	・演奏時に 演奏する.SPC ファイルと同名の .700 ファイルを発見し、スクリプトとして読み
	こむ。この時ファイルが検索PATHから発見できなかった場合は　同じPATHで「65816.700」
	というファイルを探し代替しようとする。
	・スクリプトの実行は SPC700エミュレーションと並走する（スクリプトの w コマンドでAPU
	(SPC700)の実行とスクリプトの実行が切り替わる）


・スクリプトの概略
	スクリプトファイルは「 e (改行)」のみで区切られる複数のコマンドゾーンで構成される。
	ゾーンの種別・順番は決め打ちされており「 e (改行)」の出現毎に決定される。
	現在
	　・スクリプトゾーン
	　・拡張コマンドゾーン
	が定義されている。



---- format	---------------------------------------------
(スクリプトゾーン)
	:label[0〜999]
	m	#[Data]|[Input Port]|P|W[0〜3]	[OutputPort]|W[0〜3]	; Move	%1,%2 (C言語風なら %2 = %1)
	c	#[Data]|[Input Port]|P|W[0〜3]	[InputPort ]|W[0〜3]	; Cmp	%1,%2 (C言語風なら if ((%2-%1) ..) )
	a	#[Data]|[Input Port]|P|W[0〜3]	W[0〜3]			; Add	%1,%2 (C言語風なら %2 += %1)
	n	#[Data]|[Input Port]|P|W[0〜3]   &|^   [OutputPort]|W[0〜3]
									; and|or|eor %1,%2 (C言語風なら %2 &= %1..)
	u	#[Data]|[Input Port]|P|W[]	W[]			; mUl	(signed)%1,%2 (C言語風なら %2 *= %1)
	d	#[Data]|[Input Port]|P|W[]	W[]			; Div	(signed)%1,%2 (C言語風なら %2 /= %1)

	bxx	[0〜999]						; label
	w	(#)[0〜?]|W[0-3]					; next tick
	p	[0〜?]				("string")		; offset , filename
	e								; bottom of zone

(拡張コマンドゾーン)
	m	[! 0〜255]
	c	[0〜255]	[0〜255]
	d	[0〜255]	[+-0〜?]
	e								; bottom of zone

---- format	---------------------------------------------

	・()は省略可
	・コマンドは大文字、小文字可（このDOCでは便宜上コマンドを小文字で表現している）
	・[]は数字を示す（指定は全て１０進数、有効桁数はケースバイケース(内部は一律32bit)）
	・eコマンド以外は１行に複数のコマンド記述を許可するが、コマンドや引数の判定でエラーを検出した
	　場合はエラーの出たコマンドを破棄し行末までスキップし、次の行頭から実行を再開する。
	　但しラベルの定義は１行につき行頭の１つまで。
	・引数他、エラーチェックは基本的に無し（即例外になります）
	・コメントのヘッダは ;(半角) で、そこから改行までが無効となる。


	アドレッシングモード／
	・#[Data] は データ直値（-符号有効、任意の桁の下位32bit）
	  但し w コマンド(wait)の ウエイト値設定では # を省略可能
	・[Input Port] は SPC700がSFC-CPUに送信したデータポートの内容を示す（下位8bit->32bitへ拡張）
	・[OutputPort] は SFC-CPU（このスクリプトの動作で代替）がSPC700の入力データポートへ書き出す事を示す
	  （受け付けるのはソースの下位8bit）
	・W[0〜3] は W0〜W3までのユーザーワークエリア(32bit)
	・P は 予めP [0-?] "finame" で読み込まれたファイルの、現在のポインターが指し示す内容 1byteを示す。
	・Label は１０進数で 0 から 999まで
	・offsetは１０進数で 32bitの範囲


	全ゾーン共通のコマンド／
	・e は 各コマンドゾーンの終端
		この行以降から次のコマンドゾーンの記述に入る


	スクリプトゾーンのコマンド／
	・m は データのコピー（フラグは動かないので bxxコマンドに影響なし）
	・c は データの比較（動作としては 引き算をして結果だけ以降のbxxコマンドで参照する）
	・a は データの加算（引き算は -の直値指定で実現 (A #-1 W0)）（フラグは動かない）
	・n は データの論理演算（フラグは動かない。 n #127 & W1 → W1 &= 0x7f という感じ）
	・u は データの乗算（ソースは符号付として参照。フラグは動かない）
	・d は データの除算（ソースは符号付として参照。0による除算は無視される。いづれもフラグは動かない）
	・w は ウエイトの設定
	   NextTick = SPC700クロック数換算のウエイト（スクリプトはこのコマンドが出るまで止まらずにシーケンスする）
	・p = ファイル ポインターの設定(オフセット指定時に最後に読んだファイル サイズを越えていれば
	    (例えば初動時に0以外のオフセット)ポインターは無効になる。無効の間はポインター値取得操作は無視される)
	    p は取り出しで+1され、ファイル サイズを越えた以降(この状態になれば bt0で分岐可能)の取り出しは 最後の
	    1 byteを送信し続ける。
	    ファイルネームを省略して、オフセットのリセットのみをすることも出来る
	    （一度なんらかのファイルが読まれている事）
	・bxx は 直前の C コマンドの結果で条件分岐する
	・bxx の条件分岐
		bra	if (TRUE)
		beq	if (c コマンド第二引数 == c コマンド第一引数)
		bne	if (c コマンド第二引数 != c コマンド第一引数)
		signed:
		bge	if (c コマンド第二引数 >= c コマンド第一引数)
		ble	if (c コマンド第二引数 <= c コマンド第一引数)
		bgt	if (c コマンド第二引数 >  c コマンド第一引数)
		blt	if (c コマンド第二引数 <  c コマンド第一引数)
		unsigned:
		bcc	if (c コマンド第二引数 >= c コマンド第一引数)
		blo	if (c コマンド第二引数 <= c コマンド第一引数)
		bhi	if (c コマンド第二引数 >  c コマンド第一引数)
		bcs	if (c コマンド第二引数 <  c コマンド第一引数)

		bt0	P over flow例外


	拡張コマンドゾーンのコマンド／
	・m は 音色番号による発音マスク。引数で音色番号(0〜255)を指定する。指定する度に内部フラグの真偽
	    が反転する。初期値は全て真(発音有効)。引数に ! で 全ての音色設定を反転
	・c は 音色のパッチ（エイリアス）。第一引数で指定した音色を第二引数で指定した音色に置き換える。
	    エイリアスのエイリアスは無効（常にオリジナルからのパッチ）
	・d は 音色番号によるdetune。第一引数で指定された音色使用時に、常に第二引数で指定された
	    オフセットを発音freq.に適用する




・サンプル１
	以下に ぷよぷよ系を演奏させる為の単純なスクリプトを解説する。

---- puyo.700	---------------------------------------------

	m	0	w0	; SPC700がport0(0xf4)に書き込んだ値を work0にコピー
:001
	w	16661		; 約 1V-blank分のウエイト（ここを変えるとテンポが変わる）
				; SPC700のクロック(１秒=2048000)単位で、16661クロック後に次の行に進む
				; 	1V-blankを61.46Hzと仮定し
				;	(2048000/2) / 61.46 = 16661
	a	#1	w0	; work0 の内容を＋１
	m	w0	0	; work0 の内容を SPC700が読み込むport0(0xf4)にコピー
	bra	01		; ラベル :001 に即座にジャンプ

	e			; （この例では ここには来ないけど）スクリプトの終了(停止)＝ゾーン終端

---- puyo.700	---------------------------------------------


・サンプル２
	こんな表記もアリです(改行コードも要りません)。ID700としてヘッダに埋め込む？(.700解凍否対応player用に？)

---- chaos seed とか ----------------------------------------
:1 w 31400 m #152 0 bra 1
-------------------------------------------------------------
	ただ、未知のコマンドが出た場合 改行でリスタートする(ｵﾚ的)仕様なので将来、新しいコマンドが
	追加された場合は それを認識しないプレイヤを考慮した書き方をするべきだと思います。
	この仕様を利用してscript700の実装レベルチェックに利用出来ます。たとえば

	newcommand  newparam bra 2
	1:
	w 	16661
	bra	1
	2:

	とすると newcommandに未対応のプレイヤでは 1:〜、対応品は 2:〜 と分岐が出来ます。
	これらを踏まえると 新しいコマンドを設計する際には意味の無い操作（a #0 w0 とか w 0 のような物）
	排除しない設計にするとナイスかもしれません（美しくないですか？）
	

・サンプル３
	取り込み時に紛れ込む SEだけを消音したい
---- popn tiwnbee -------------------------------------------
e				; スクリプトゾーンは特に無し
				; で、ここから拡張コマンドゾーン
m 17				; 音色マスクの設定。
-------------------------------------------------------------





・注意
	・アドレッシングモードの P とコマンドの P は 出てくる場所で識別している。


*/
