em1keyを使って「飛鳥カナ配列」の「同期連続シフト」を実現するための改造ポイントに関するメモ。


 まずは、一番わけのわからない定数が並んでいる「キーのバッファリング」部分に、コメントを一揃い付けてみました。
 こうしてコメントを付けてみれば「なぜこういう定数名を採用したのか」が良く解るようです。
 「キーバッファの送信」部分についても、CALLVARについてのみコメントを追加しました。
 ここで何が起きているのかを理解できないと、そもそもoyayubiwmの挙動を理解できない(逆に言えば、ここさえ解ればある程度は理解できる)ので、「暗記はせずに流れをつかむ」とよいのかも。

oyayubiwm(v1.42)/line1851-1912/動作説明の追加。

#------------------------------------------------------------------------------
# 親指シフトの実行ロジック
#------------------------------------------------------------------------------

# KeyBuffer
# 一般キーの情報をバッファリングする
func TABLE_FUNC _subPushKey
		TESTGSTATE	_gs_ISLEFT		# ←左親指押下中は1、右親指押下中は0。
		STOREVAR	_KB_ISLEFT		# →_subFlushAll で_OB_ISLEFTと比較。
		LOADVAR		_IN_DF_FUNC		# ←LOADVAR 0(無シフト文字)。
		STOREVAR	_KB_DF_FUNC		# →_subFlushKeyでCALLVARされる。
		LOADVAR		_IN_OS_FUNC		# ←LOADVAR 1(同手シフト文字)。
		STOREVAR	_KB_OS_FUNC		# →_subFlushAllでCALLVARされる。 
		LOADVAR		_IN_CR_FUNC		# ←LOADVAR 2(対手シフト文字)。
		STOREVAR	_KB_CR_FUNC		# →_subFlushAllでCALLVARされる。 
		LOADVAR		_IN_SH_FUNC		# ←LOADVAR 3(小指シフト文字)。
		STOREVAR	_KB_SH_FUNC		# →_subFlushKeyでCALLVARされる。 
		LOADVAR		GVAR_KEYCODE	# ←VAR37(呼び出し時キーコード)保管。
		STOREVAR	_KB_KEYCODE		# →_subExecKeyで自分自身か否か判定。
		LOADVAR		GVAR_EVENTTIME	# ←VAR38(キー呼び出し時刻)保管。
		STOREVAR	_KB_TIME		# →_subExecKeyでOB_TIMEから引き算。
		SETGSTATE	_gs_KEYBUFFER	# →宣言「文字バッファがあるよ!」
		RETURN	0
endfunc

# OSBuffer
# 親指シフトキーをバッファリングする
func TABLE_FUNC _subPushOS
		TESTGSTATE	_gs_ISLEFT		# ←左親指押下中は1、右親指押下中は0。
		STOREVAR	_OB_ISLEFT		# _subFlushAll で_KB_ISLEFTと比較。
		LOADVAR		_IN_DF_FUNC		# ←LOADVAR 0(無シフト文字)。
		STOREVAR	_OB_FUNC		# _subFlushKeyでCALLVARされる。
		LOADVAR		GVAR_KEYCODE	# ←VAR37(呼び出し時キーコード)保管。
		STOREVAR	_OB_KEYCODE		# _subExecKeyで自分自身か否か判定。
		LOADVAR		GVAR_EVENTTIME	# ←VAR38(キー呼び出し時刻)保管。
		STOREVAR	_OB_TIME		# →_subExecKeyでOB_TIMEから引き算。
		SETGSTATE	_gs_OSBUFFER	# →宣言「親指バッファがあるよ!」
		RETURN	0
endfunc


# キーバッファの送信を行う
#   シフト無しの送信のみ、親指シフト状態は変更しない。
func TABLE_FUNC _subFlushKey	#_subFlushAllから呼ばれる関数。
		TESTGSTATE	_gs_KEYBUFFER
		IF_FALSE	80			# キーバッファが無い場合は飛ぶ(何もしない)
		IF_SHIFT	60			# 小指シフトなら飛ぶ
		# デフォルトコード送信
		ifsw LOS_ALT_PATCH_ENABLE1
			RAWUP	VK_LMENU
		endif
		CALLVAR	_KB_DF_FUNC			# 通常コード実行(VAR 0=無シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
	LABEL	80
		RETURN	0
	LABEL	60
		# 小指シフト
		RAWUP	VK_SHIFT			# 小指shift キーのキャンセル
		CALLVAR	_KB_SH_FUNC			# 小指shift 実行(VAR 3=小指シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
		RETURN	0
endfunc

 つぎに、「同期(=同時)」シフトを「同期連続」シフトへと改造するために、シフトのキャンセル部分をコメントアウトしました。
 「同期(=同時)」シフトでは「文字→シフト→文字」の順でキーが押された場合に、シフトが仮に前の文字を修飾すれば「後ろの文字は修飾せずアンシフトにして出す」仕掛けになっています。
 「同期連続」シフトではこの場合、「シフトを離すまでずっと、シフトは全ての文字を修飾し続ける」ので、ここでシフトの状態をクリアされてしまっては困ります……ということで、その部分を弄ってみました。


 もとのスクリプトでは、「RESETGSTATE _gs_OSBUFFER」という部分で親指シフトのバッファ(があることを示すフラグ)をリセットしているのですが、これをリセットしないようにしました……とはいっても、元の命令の頭に###をつけて、単にコメント化しただけです^^;。

oyayubiwm(v1.42)/line1915-1957/同期シフト→同期連続シフトへの改造。

# キーバッファの送信する
#   バッファをすべて解消する。親指シフトがあれば考慮する。
func TABLE_FUNC _subFlushAll
		TESTGSTATE	_gs_KEYBUFFER
		IF_FALSE	80		# キーバッファが無い場合は飛ぶ
		# キーバッファあり
		TESTGSTATE	_gs_OSBUFFER
		IF_TRUE		20		# 親指シフトありなら飛ぶ
		# シフトなし、キーバッファのみ
		CALL	_subFlushKey
		RETURN	0
	LABEL	20
		# キーバッファも親指シフトもある場合
		#  クロスシフト判定
		LOADVAR		_OB_ISLEFT
		CMPVAR_EQ	_KB_ISLEFT
		IF_FALSE	40	# クロスならとぶ
		# 通常親指シフト
		ifsw LOS_ALT_PATCH_ENABLE1
			RAWUP	VK_LMENU
		endif
		CALLVAR	_KB_OS_FUNC			# 親指シフト実行(VAR 1=同手シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
		###     RESETGSTATE     _gs_OSBUFFER    # 親指shift状態をクリア★★飛鳥では不使用★★
		RETURN	0
	LABEL	40
		# クロス親指シフト
		ifsw LOS_ALT_PATCH_ENABLE1
			RAWUP	VK_LMENU
		endif
		CALLVAR	_KB_CR_FUNC			# クロスシフトの実行(VAR 2=対手シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
		###     RESETGSTATE     _gs_OSBUFFER    # 親指shift状態をクリア★★飛鳥では不使用★★
		RETURN	0
	LABEL	80
		# キーバッファが無い場合
		TESTGSTATE	_gs_OSBUFFER
		IF_FALSE	60				# 親指シフトが無ければ飛ぶ
		CALLVAR	_OB_FUNC			# 親指シフト単独機能の実行
		RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥でも使用★★
	LABEL	60
		RETURN	0
endfunc


 さて、上の修正のみを行った状態で、実際にスクリプトを走らせてみた……のですが、特定のシーケンスでキー操作をすると「シフトがかかったまま、親指キーを離してもシフトが外れない」状態になりました(当たり前ですね……^^;)。
 「同期連続」シフトでは、「シフトを離すまでずっと、シフトは全ての文字を修飾し続ける」ので、逆に言えば「シフトを離したときには、問答無用でバッファをフラッシュして、かつ親指シフト状態をクリアすればよい」ことになります。


 親指シフトキーに関する「キーイベントでドライブされる関数」は、オプションの関数を含めて「ほぼ同じ内容のものが」6つあります。
 6つの関数の冒頭に、それぞれ「キーUpの場合のみ、バッファをフラッシュして、かつ親指シフト状態をクリアする」ための記述を行いました。
 バッファのフラッシュは「_subFlushAll」をCALLするだけでよいようになっていますので、まさに上に書いたまま「キーDownなら処理を無視→バッファフラッシュ→親指シフト状態をクリア」をそのまま記述してみました。

oyayubiwm(v1.42)/line2946-3041/同期シフト→同期連続シフトへの改造。

#------------------------------------------------------------------------------
# 親指シフトキー
#------------------------------------------------------------------------------

# 親指シフトキーはいくつでも設定できます

# 左親指シフト1
func _TABLE_OS	LOS_KEYCODE1
			IF_DOWN 100	#キーUp以外では直下の行を無視。	#★★飛鳥用に必要★★
				CALL	_subFlushAll		#★★飛鳥用に必要★★
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100						#★★飛鳥用に必要★★
		ifsw LOS_ALT_PATCH_ENABLE1
		# 左親指シフトキーに ALT を割り当てた場合の処理。かなり強引。
				IF_UP	10
				RAWUP VK_LMENU
			LABEL	10
		endif
		ALLOCVSTATE	0
		SETGSTATE	_gs_ISLEFT	# 左
		SETVAR0	LOS_SHARE_FUNC1
		CALL	_subExecOS
endfunc


# 左親指シフト2
ifsw LOS_KEYCODE2
	func _TABLE_OS	LOS_KEYCODE2
			IF_DOWN 100	#キーUp以外では直下の行を無視。	#★★飛鳥用に必要★★
				CALL	_subFlushAll		#★★飛鳥用に必要★★
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100						#★★飛鳥用に必要★★
		ALLOCVSTATE	0
		SETGSTATE	_gs_ISLEFT	# 左
		SETVAR0	LOS_SHARE_FUNC2
		CALL	_subExecOS
	endfunc
endif


# 左親指シフト3
ifsw LOS_KEYCODE3
	func _TABLE_OS	LOS_KEYCODE3
			IF_DOWN 100	#キーUp以外では直下の行を無視。	#★★飛鳥用に必要★★
				CALL	_subFlushAll		#★★飛鳥用に必要★★
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100						#★★飛鳥用に必要★★
		ALLOCVSTATE	0
		SETGSTATE	_gs_ISLEFT	# 左
		SETVAR0	LOS_SHARE_FUNC3
		CALL	_subExecOS
	endfunc
endif


# 右親指シフト1
func _TABLE_OS	ROS_KEYCODE1
			IF_DOWN 100	#キーUp以外では直下の行を無視。	#★★飛鳥用に必要★★
				CALL	_subFlushAll		#★★飛鳥用に必要★★
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100						#★★飛鳥用に必要★★
		ALLOCVSTATE	0
		RESETGSTATE	_gs_ISLEFT	# 右
		SETVAR0	ROS_SHARE_FUNC1
		CALL	_subExecOS
endfunc


# 右親指シフト2
ifsw ROS_KEYCODE2
	func _TABLE_OS	ROS_KEYCODE2
			IF_DOWN 100	#キーUp以外では直下の行を無視。	#★★飛鳥用に必要★★
				CALL	_subFlushAll		#★★飛鳥用に必要★★
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100						#★★飛鳥用に必要★★
		ALLOCVSTATE	0
		RESETGSTATE	_gs_ISLEFT	# 右
		SETVAR0	ROS_SHARE_FUNC2
		CALL	_subExecOS
	endfunc
endif


# 右親指シフト3
ifsw ROS_KEYCODE3
	func _TABLE_OS	ROS_KEYCODE3
			IF_DOWN 100	#キーUp以外では直下の行を無視。	#★★飛鳥用に必要★★
				CALL	_subFlushAll		#★★飛鳥用に必要★★
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100						#★★飛鳥用に必要★★
		ALLOCVSTATE	0
		RESETGSTATE	_gs_ISLEFT	# 右
		SETVAR0	ROS_SHARE_FUNC3
		CALL	_subExecOS
	endfunc
endif

 テストをした時点では、まだ文字配列をNICOLAのままにしていました……ので、NICOLAの連続シフトになってしまいました^^;。
 とりあえず、「oyayubiwmを弄ってつくる方法であれば」連続シフト化は容易に達成できるようです。


 とはいえ、これらの変更部分を ifsw〜endif や ifnsw〜endif で囲んで「定数でスイッチしよう」とすると、なぜかうまくいかないんですよね……うーん、なぜだろうorz。
 ついでに言うと、フルスクラッチで作る方は……まだ全く浮かんできません。こっちはまだまだ先になりそうです。