em1key スクリプトマニュアル v1.26.0 2007/08/11 Hiroyuki Ogasawara ●はじめに em1key で置き換えるキーの挙動はスクリプトファイルで記述されています。em1key 自体はスクリプトの命令を順番に実行しているにすぎません。このマニュアルでは スクリプトの各命令について解説しています。標準設定で満足できない方、全く異 なる機能を実装してみたい方は参考にしてください。 ただしこのスクリプトはユーザーが直接書き換えることを余り想定していないので、 非常に低レベルで必ずしもわかりやすくはできていません。命令構文も必要最小限で あって、ほとんどアセンブラに近いものとなっています。 その代わりキーの判定から内部状態まで、非常に細かい低レベルなところまでスク リプトで記述することができます。 ●特徴 ・記述できる構文は非常に低レベルです。アセンブラ並み。 ・関数登録とサブルーチン呼び出しが可能です。 ・簡単なフラグや変数制御ができるので、ctrlswapmini のようなただのテーブル化  よりは複雑な処理を設定ファイルに記述できます。 ・読み込まれた時点ですべてのシンボル処理は完了し、バイナリ変換します。メモリ  消費は小さく動作も比較的高速です。 ・バイナリ化のデコーダ自体も非常に単純でコンパクトです。 ・キー長押し判定などアルゴリズムもスクリプトによって外部データ化しているので、  不要な機能は常駐コードに含ませる必要がありません。 ・PC版(WindowsVista/XP)に対応しました。PC と WindowsMobile(WindowsCE) 版で  設定ファイルを共有できます。 ●スクリプトの読み込み 起動時に em1key.exe (em1keypc.exe) と同じ場所にある scriptcommand.txt を読み 込みます。スクリプトを更新して読み込みなおす場合は、一旦 em1key を終了させて 起動しなおす必要があります。 ●関数 スクリプト命令は関数単位で記述します。スクリプトファイルはたくさんの関数定義 の集まりです。 関数はいくつでも定義できますが、外から参照するためには既知のテーブルに登録し ておく必要があります。 この関数登録のテーブルが現在3種類あります。 ・TABLE_FUNC サブルーチン用の関数を登録します。テーブル番号(関数番号) 0〜255 は 任意に使用することができて、サブルーチンの呼び出し意外には使われま せん。特殊な条件で呼び出される固定の関数を定義することもできます。 ・TABLE_DEFAULT デフォルトのキーテーブルです。ここに登録すると、対応するキーが押さ れたときと離したときに呼ばれます。 例えば関数番号 0x31 (= '1') に関数を登録しておくと、[1] キーが押さ れたときに実行します。 ・TABLE_EXT 拡張用キーテーブルです。必要に応じて TABLE_DEFAULT と切り替えて使用 できます。 ・TABLE_ALLMODE TABLE_DEFAULT と TABLE_EXT の両方に一度に登録することを意味してい ます。両方のモードで動作させたい関数はこの指定をします。 ●数値定数の記述方法 数値は 0〜255 の 1byte のみ扱うことができます。定数の書式は次の通りです。 ・10進数定数 0〜255 ・16進数定数 0x00〜0xff ・文字定数 'A'〜'Z' '0'〜'9' 等、任意の文字 ・シンボル名 任意の英数字 シンボル名は define 命令で定義することができます。例えば次のように定義して おくと、定数 0x23 の代わりに EXEC_KEY と書けるようになります。 define EXEC_KEY 0x23 ●呼び出し TABLE_DEFAULT/TABLE_EXT に登録した関数は、指定したキーが押されるたびに実行 します。KEYDOWN / KEYUP のどちらのイベントでも呼ばれるので、一回のキー入力で 最低2度呼び出しがかかります。またキーリピート時は KEYUP の前に何度も KEYDOWN の呼び出しが発生します。 スクリプトを読み込んだ直後など、特殊なタイミングで呼び出される関数を定義する こともできます。現在実装されているキー以外のイベント関数は次のとおりです。 特に定義しなくても構いません。未定義の場合は呼び出されません。 ・TABLE_FUNC 0x00 起動時に一番最初に一回だけ呼び出されます。初期化や最初のフラグ設定、 モード設定、デフォルト地の設定等ができます。 ・TABLE_FUNC 0x01 もし定義してあれば、各種キー入力用のイベントが発生する直前に共通で 呼ばれます。 実際のキーシーケンスの記述には、スクリプト命令の把握だけでなく Windows 内部 でどのようにキーコードが使われており、どのようなキーコードが必要なのかある 程度知っている必要があります。 ●スクリプトで扱えるデータメモリ ・SystemFlag / 1bit × 32  em1key 本体の挙動を切り替えるための bool 値 (Bit情報) です。設定ダイアログ  で設定した結果をレジストリに保存します。起動時にレジストリの値を SystemFlag  の初期値として代入します。  挙動を変更するために動作中スクリプトで書き換えることもできますが、その結果  はレジストリには保存しません。   ※ v1.00 では特に設定項目が無いためレジストリへのデータ保存はありません。 ・GlobalState (GSTATE) / 1bit × 32  スクリプト中で自由に変更できる bool 値 (Bit情報) です。32bit 分あり、  global 値なのですべての関数から同じ値としてアクセスできます。 ・Global変数 / 32bit × 32  32個分の Global 変数があります。自由に使うことができます。1つの変数は  32bit 分ありますが、スクリプト内からは 0〜255 の 8bit 符号無しの値しか  読み書きできません。内部の演算などは符号付 32bit で行われています。  (説明中 VAR0〜VAR31 等と表記することがあります) ・LocalState (VSTATE) / 1bit × 8  スクリプトの関数ローカルな bool 値 (Bit情報) です。8bit 分あります。  ALLOCVSTATE 命令実行時に、スクリプトのメモリコード領域から確保します。  そのため C言語の static 変数相当になります。  初期値はプログラム起動時に代入されて、以後読み書きした値が保存されます。  ALLOCVSTATE 命令毎に異なる領域が確保されます。1つの関数で複数回  ALLOCVSTATE を実行するとそれぞれ別の領域とみなすので注意が必要です。 ・カレントレジスタ / 32bit × 1  一時的な演算結果などを格納するためのテンポラリ変数です。 ・ストリング領域 / 参照 × 4  string 命令による文字列定数への参照を最大4つ保存します。文字列定数自体は  いくつでも持つことができますが、スクリプト命令実行のための文脈上、文字列  への参照を同時に 4つまで保持することができます。 ・特殊なGlobal変数 / 32bit × 32  通常汎用的に使える Global 変数の番号指定は 0〜31 ですが、次の変数番号を  指定すると特殊なパラメータを直接読み書きすることができます。つまり、内部  状態の値はもともと Global 変数の一部として保存されています。 VAR32 = GlobalState VAR33 = SaveTime (SAVETIME 命令で保存したキーイベント発生時の時間) VAR34 = DiffTime (SETDIFFTIME 命令で設定した時間値、msec 単位) VAR35 = Modifier (SETMODIFIER 命令で設定したパラメータ) VAR36 = DataStackPointer (PUSHVAR/POPVAR 命令で書き換わる) VAR37 = KeyCode (呼び出したとき押されていたキーコード) VAR38 = EventTime (キーイベントが発生した時間) VAR39 = ScanCode VAR40 = TableID (SETTABLE の番号) VAR41〜 リザーブ VAR48〜 データスタック ・データスタック / 32bit × 32  データを FIFO で格納できるスタックです。サブルーチンへの引数渡しの代わりに  使えます。実際は Global 変数領域の一部が使われています。 ●分岐 スクリプト命令は、ラベルを使った分岐とサブルーチン呼び出しの2種類の分岐を サポートします。 ・ラベル分岐 同一関数内で宣言した LABEL にジャンプします。 ・サブルーチン呼び出し TABLE_FUNC に登録した任意の関数を呼び出します。呼び出しは最大8段 までネストすることができます。 ●行の記述 # で始まる行はコメントです。1行に 1命令記述することができます。 ●基本コマンド スクリプトデコーダー(コンパイラ)が解釈する命令です。 func <登録先> <関数番号> ------------------------------------------------------------------------------- 関数定義を開始します。必ず endfunc と対になります。 登録する関数テーブルと関数番号を指定します。 <登録先> 以下のいずれかのテーブルを指定します。 TABLE_FUNC 関数用テーブル TABLE_DEFAULT デフォルトキーテーブル TABLE_EXT 拡張用のキーテーブル TABLE_ALLMODE すべてのキーテーブル (TABLE_DEFAULT と TABLE_EXT の両方) <関数番号> 0〜255 の番号です。登録先がキーテーブル (TABLE_DEFAULT か TABLE_EXT )の場合は割り当てる キーコードに一致します。 すでに登録してある番号に登録すると上書きとなります。そのため一番最後 に定義した内容が有効です。 ------------------------------------------------------------------------------- endfunc ------------------------------------------------------------------------------- 関数定義を終了します。必ず func と対になっている必要があります。 ------------------------------------------------------------------------------- define <シンボル名> <数値> ------------------------------------------------------------------------------- 任意の数値をシンボル名に割り当てます。以後数値の変わりにシンボル名を 記述できるようになります。 func とは異なりシンボルの多重定義は値の上書きとなりません。また現在 多重定義エラーも出ません。常に最初の定義値が有効になっているので注意 してください。この仕様はあとで変更される可能性があります。 ------------------------------------------------------------------------------- ifpc ifce ifsw <シンボル名> ifnsw <シンボル名> ------------------------------------------------------------------------------- それぞれプラットフォームでのみ有効なコードを記述できます。例えば ifpc の場合 WindowsMobile (WindowsCE) 版で読み込むと endif までの間の記述 が無視されます。必ず endif と対で使用する必要があります。 この命令は実行時の分岐ではなく、スクリプトファイルを読み込むときに 判断します。C言語のプリプロセッサ命令 #if/#ifdef に相当します。 ifsw はシンボルの定義値が 0 の場合に endif まで読み飛ばします。 ifnsw はシンボルの定義値が 0 でない場合に endif まで読み飛ばします。 if**〜endif のブロックは最大 32段までネストできます。(v1.26以降のみ) ------------------------------------------------------------------------------- endif ------------------------------------------------------------------------------- ifpc/ifce/ifsw/ifnsw の終わりを意味します。 ------------------------------------------------------------------------------- ●命令 func 〜 endfunc の中に記述できます。正確にはこれらの命令は define された opcode 列です。そのため定義し直すだけで命令名を変更することができます。 ◎制御命令 EXIT <終了コード> ------------------------------------------------------------------------------- スクリプトの呼び出しを終了します。 サブルーチンの中からでも終了することが可能です。 キーに対応したアクションとしてスクリプトが呼び出された場合、終了 コードによって動作が異なります。 <終了コード> TRUE キーコードの置き換えを意味します。 もともとのキーコードは捨てられます。 FALSE 元のキーもそのままアプリケーションに渡します。 例 func TABLE_DEFAULT '1' SENDKEY 'Z' EXIT TRUE endfunc この場合 [1] のキーを押すと 'Z' が送信され、元のキーコード '1' は 無かったことになります。キーの置換が可能となります。 func TABLE_DEFAULT '1' SENDKEY 'Z' EXIT FALSE endfunc この場合は 'Z' を送信しますが元の '1' のキーコードも有効なので、 追加で 'Z' が押されたことになります。キーコードの置換はしないけど 押された情報を内部で取得したい場合等に使います。 ------------------------------------------------------------------------------- JUMP <ラベル番号> ------------------------------------------------------------------------------- 任意のラベルに飛びます。ラベル番号は同じ関数の中だけで有効です。 またこの命令は進行先(下方向)にしかジャンプできません。 前に戻るような逆方向ジャンプを行う場合は JUMPALL 命令を使ってください。 例 JUMP 30 : LABEL 30 ------------------------------------------------------------------------------- JUMPALL <ラベル番号> ------------------------------------------------------------------------------- 任意のラベルに飛びます。ラベル番号は同じ関数の中だけ有効です。 この命令は同じ関数内のすべてのラベルにジャンプすることができます。 他の命令が進行方向へのジャンプに制限してあるのは、記述ミスやバグに よる永久ループを防ぐためです。どうしても前に戻りたい場合のみこの命令 を使ってください。 ------------------------------------------------------------------------------- LABEL <ラベル番号> ------------------------------------------------------------------------------- 関数内に飛び先を作ります。ラベル番号は 0〜255 の範囲で指定します。 わかりやすくするためにシンボル定義を併用することが可能です。 ラベル番号は同一の関数内だけで有効です。関数が異なれば同一の番号が 何度あってもかまいません。 このラベル番号を目安に、JUMP や IF_〜 命令は分岐することが可能です。 同一関数内に複数回同じ番号のラベルを定義した場合は次のようになります。 ・JUMPALL の場合、関数の先頭に近いほうが優先 ・JUMPALL 以外のジャンプ命令、ジャンプ命令以降かつ近いものが優先 ------------------------------------------------------------------------------- CALL <関数番号> ------------------------------------------------------------------------------- 任意の関数をサブルーチン呼び出しします。飛び先で RETURN 命令に遭遇 すると戻ってきます。サブルーチン内部で EXIT 命令が呼ばれた場合や何ら かのエラーが発生した場合は戻ってきません。 関数番号は必ず TABLE_FUNC の番号です。TABLE_DEFAULT や TABLE_EXT の 関数を呼び出すことはできません。 関数呼び出しは最大 16段までネストすることができます。(v1.24までは 8段) ------------------------------------------------------------------------------- CALLVAR <変数番号> CALLVARDEF <変数番号> CALLVAREXT <変数番号> ------------------------------------------------------------------------------- 指定した番号の変数の値を、関数番号とみなしてサブルーチン呼び出しします。 例えば SETVAR3 0x20 CALLVAR 3 この場合 Global 変数 3 に 0x20 が書き込まれているので、TABLE_FUNC の 0x20 の関数を呼び出します。CallBack のように関数自体をサブルーチン に渡したい場合に使うことができます。 CALLVARDEF/CALLVAREXT を使うと、TABLE_FUNC 以外のテーブルの関数も 呼び出すことができます。なお、TABLE_FUNC は未定義関数を呼び出すと エラーになりますが、TABLE_DEFAULT / TABLE_EXT の場合未定義関数呼び 出しはエラーにならずに無視します。 ------------------------------------------------------------------------------- RETURN 0 ------------------------------------------------------------------------------- サブルーチン呼び出しから戻ります。引数は特に意味を持っていません。 サブルーチンでない状態で RETURN を実行した場合はエラーとなり、その 場で即座に実行を中止します。 ------------------------------------------------------------------------------- SETMODIFIER <修飾キー> ------------------------------------------------------------------------------- SENDKEY で送信するキーコードへの修飾を行います。この命令でセットした 値は、直後の SENDKEY/SENDVAR だけで有効となります。 <修飾キー> MOD_CTRL (0x01) MOD_SHIFT (0x02) MOD_RWIN (0x10) MOD_KANA (0x20) 例えば次のように指定した場合 SETMODIFIER MOD_SHIFT SENDKEY 'A' SHIFT + [A] のキーコード送信になります。 具体的には SENDKEY の前後に、KEYDOWN/KEYUP のペアで CTRL/SHIFT 等の キーを挿入します。上記の例だと RAWDOWN VK_SHIFT RAWDOWN 'A' RAWUP 'A' RAWUP VK_SHIFT に相当します。なお、複数同時に指定することもできます。その場合直接 数値で指定してください。 SETMODIFIER 0x03 # CTRL+SHIFT SENDKEY 'A' MOD_KANA は若干特殊なキーコードを生成します。一時的にかな用キーコー ドを挿入することができます。 例えばすべての MODIFIER を有効にした場合次のようになります。 SETMODIFIER 0x33 # CTRL+SHIFT+RWIN+KANA SENDKEY 'A' # 上記の命令は次のシーケンスに等しい RAWDOWN VK_CONTROL RAWDOWN VK_SHIFT RAWDOWN VK_RWIN RAWDOWN VK_KANA RAWDOWN 'A' RAWUP VK_KANA RAWDOWN VK_KANA RAWUP 'A' RAWUP VK_KANA RAWUP VK_RWIN RAWUP VK_SHIFT RAWUP VK_CONTROL ------------------------------------------------------------------------------- SENDKEY <キーコード> ------------------------------------------------------------------------------- キーコードを送信します。任意のキーが押されたことと同じ状態を作ります。 この命令は必ず KEYDOWN と KEYUP のペアのコードを送信します。 また前後に SETMODIFIER で指定した修飾キーコードを挿入することが できます。 KEYDOWN と KEYUP を別々に指定する場合は RAWDOWN/RAWUP 命令を使ってく ださい。 キーコードは次のようになります。 ・特殊キー VK_ESCAPE 等の VK_ で始まるシンボル ・数字キー '0'〜'9' ・アルファベットキー 'A'〜'Z' (必ず大文字) ------------------------------------------------------------------------------- SENDVAR <変数番号> ------------------------------------------------------------------------------- キーコードを直接送信する代わりにグローバル変数の番号を指定します。 変数に書き込まれている値をキーコードとみなします。 ------------------------------------------------------------------------------- RAWDOWN <キーコード> ------------------------------------------------------------------------------- キーコードを送信します。キーを押した状態を作ります。 SETMODIFIER + SENDKEY よりも低レベルな制御ができます。 ------------------------------------------------------------------------------- RAWUP <キーコード> ------------------------------------------------------------------------------- キーコードを送信します。キーを離した状態を作ります。 SETMODIFIER + SENDKEY よりも低レベルな制御ができます。 ------------------------------------------------------------------------------- DOWNVAR <変数番号> ------------------------------------------------------------------------------- 変数に書き込まれたキーコードを送信します。キーを押した状態を作ります。 SETMODIFIER + SENDKEY よりも低レベルな制御ができます。 ------------------------------------------------------------------------------- UPVAR <変数番号> ------------------------------------------------------------------------------- 変数に書き込まれたキーコードを送信します。キーを離した状態を作ります。 SETMODIFIER + SENDKEY よりも低レベルな制御ができます。 ------------------------------------------------------------------------------- SAVETIME 0 ------------------------------------------------------------------------------- 現在のキーコード送信時間を特殊な専用レジスタに保存します。 引数は意味を持ちません。 この値を元に長押しなどの IF_DIFFTIME 判定を行うことができます。 保存した値は Global 変数の VAR33 で参照することができます。 ------------------------------------------------------------------------------- SETDIFFTIME <差分時間> ------------------------------------------------------------------------------- IF_DIFFTIME 命令で判定する時間を登録します。 <差分時間> 40msec 単位で指定します。25 で 1秒に相当します。 250 を設定すると約10秒となります。 保存した値は Global 変数の VAR34 で参照することができます。 ただし VAR34 の値は msec に変換してあるので注意してください。 ------------------------------------------------------------------------------- SETGSTATE ------------------------------------------------------------------------------- Global のフラグ値を設定します。指定した番号の bit が ON になります。 は 0〜31 まで指定できます。 GSTATE はすべての関数で共通にアクセスできるグローバル領域です。 GSTATE の値は Global 変数 VAR32 として直接アクセスすることもできます。 ------------------------------------------------------------------------------- RESETGSTATE ------------------------------------------------------------------------------- Global のフラグ値を設定します。指定した番号の bit が OFF になります。 は 0〜31 まで指定できます。 ------------------------------------------------------------------------------- TESTGSTATE ------------------------------------------------------------------------------- 指定したフラグが ON か OFF か、 0 or 1 の値で返します。 返した値はカレントレジスタに格納されます。 ------------------------------------------------------------------------------- ALLOCVSTATE <初期値> ------------------------------------------------------------------------------- スクリプトローカルの bitフラグ領域を確保します。 この値はスクリプト関数ごとに確保されます。値を書き換えると次の呼び出 しでも変わりません。C言語の static 変数に相当します。 初期値は初回のプログラムの読み込み時に参照されます。実行時には無視 します。 ------------------------------------------------------------------------------- SETVSTATE ------------------------------------------------------------------------------- スクリプトローカルの bit フラグ値を設定します。 指定した番号の bit が ON になります。 直前に実行した ALLOCVSTATE の値を書き換えることができます。 は 0〜7 まで指定できます。 ------------------------------------------------------------------------------- RESETVSTATE ------------------------------------------------------------------------------- スクリプトローカルの bit フラグ値を設定します。 指定した番号の bit が OFF になります。 直前に実行した ALLOCVSTATE の値を書き換えることができます。 は 0〜7 まで指定できます。 ------------------------------------------------------------------------------- TESTVSTATE ------------------------------------------------------------------------------- 指定したフラグが ON か OFF か、 0 or 1 の値で返します。 返した値はカレントレジスタに格納されます。 ------------------------------------------------------------------------------- SETSYSFLAG ------------------------------------------------------------------------------- em1key の挙動を変更するための flag を設定します。 指定したフラグを ON にします。 この値の機能はシステムに予約されているのでスクリプトで機能を割り当 てて使うことはできません。そのような用途には GSTATE を使ってください。 SYSFLAG_CTRLSWAP SYSFLAG_ESCSWAP 隠し機能である USB 外付けキーボード利用時のキー入れ替えを 有効にします。 SYSFLAG_SCANTEST このフラグが on の場合、EMONE/ZERO3 の内蔵キーボードのキーか どうか判定し、内部のフラグに反映させます。内蔵キーボードと それ以外で動作を変更させることが可能です。このフラグが off の場合は常に有効扱いになります。EMONE/ZERO3 以外の機種では 判別できないので off で使用してください。 SYSFLAG_IMESW [文字]キーで IME の On/Off できるようにします。このフラグが off の場合 [文字] キーの置き換えは行いません。 SYSFLAG_NAVIMODE NumLock 状態を制御します。このフラグが On のとき[0]〜[9]が 置き換わります。このフラグを off にすると直接数値入力できる ようになります。(off = NumLock状態) SYSFLAG_IME IME が現在 On か Off なのか格納されています。この値は WINCMD WINCMD_IMESW か WINCMD_GETIMEMODE の呼び出し時に 判定されるので、他の手段で IME の状態を変更した場合は この bit に反映されないので注意してください。 SYSFLAG_SCANVALID SCANTEST の結果が入ります。有効な場合(内蔵キーボードとみな せる場合)は On になります。SYSFLAG_SCANTEST が off の場合は 常に On になります。 SYSFLAG_SCANANY SCANTEST の結果が入ります。内蔵か外付けか判断できないあいま いなケースで On になります。SYSFLAG_SCANTEST が off の場合は 常に On になります。 ------------------------------------------------------------------------------- RESETSYSFLAG ------------------------------------------------------------------------------- em1key の挙動を変更するための flag を設定します。 指定したフラグを OFF にします。 ------------------------------------------------------------------------------- TESTSYSFLAG ------------------------------------------------------------------------------- 指定したフラグが ON か OFF かを 0 or 1 の値で返します。 返した値はカレントレジスタに格納されます。 ------------------------------------------------------------------------------- SETVAR0 <代入値> SETVAR1 <代入値> SETVAR2 <代入値> SETVAR3 <代入値> ------------------------------------------------------------------------------- Globa変数 0〜3 に直接値を代入します。 Global変数は 32 個ありますが、直接代入命令を持っているのは最初の4つ だけです。それ以外の変数へはカレントレジスタ経由でアクセスする必要が あります。 例 SETVAR8 相当 LOAD 0xff STOREVAR 8 ------------------------------------------------------------------------------- LOADVAR <変数番号> ------------------------------------------------------------------------------- 指定した Global変数の値をカレントレジスタに読み込みます。 <変数番号> 0〜127 ------------------------------------------------------------------------------- STOREVAR <変数番号> ------------------------------------------------------------------------------- カレントレジスタの値を、指定した Global変数に代入します。 <変数番号> 0〜127 ------------------------------------------------------------------------------- LOADIVAR <変数番号> ------------------------------------------------------------------------------- 指定した Global変数の内容をさらに変数を指定する番号とみなして、 変数の値をカレントレジスタに読み込みます。間接読み込みです。 <変数番号> 0〜127 例 SETVAR2 4 LOADIVAR 2 # VAR2 が 4 なので、変数 VAR4 の値を読み込む ------------------------------------------------------------------------------- STOREIVAR <変数番号> ------------------------------------------------------------------------------- 指定した Global変数の値を変数番号とみなして、変数にカレントレジスタ の値を代入します。間接書き込みです。 <変数番号> 0〜127 例 SETVAR2 3 STOREIVAR 2 # VAR2 が 3 なので、変数 VAR3 に値を書き込む ------------------------------------------------------------------------------- PUSHVAR <変数番号> ------------------------------------------------------------------------------- 指定した変数の値をデータスタックに格納します。 <変数番号> 0〜127 ------------------------------------------------------------------------------- POPVAR <変数番号> ------------------------------------------------------------------------------- データスタックの値を指定した変数に取り出します。 <変数番号> 0〜127 ------------------------------------------------------------------------------- PUSHIMM <値> ------------------------------------------------------------------------------- 指定した値を直接データスタックに格納します。関数に連続して値を渡す 場合に便利です。 例 PUSHIMM 'A' PUSHIMM 'B' PUSHIMM 'E' ------------------------------------------------------------------------------- LOAD <代入値> ------------------------------------------------------------------------------- カレントレジスタに直接値を代入します。 ------------------------------------------------------------------------------- CMP_EQ <定数> CMP_LT <定数> CMP_GT <定数> ------------------------------------------------------------------------------- カレントレジスタの値と <定数> を比較します。 条件が成立するときカレントレジスタの値に 0 以外を、成立しないときは 0 が入ります。 EQ: 等しいとき真 LT: カレントレジスタ < 定数のとき真 GT: カレントレジスタ > 定数のとき真 ------------------------------------------------------------------------------- CMPVAR_EQ <変数番号> CMPVAR_LT <変数番号> CMPVAR_GT <変数番号> ------------------------------------------------------------------------------- カレントレジスタの値と変数を比較します。 条件が成立するときカレントレジスタの値に 0 以外を、成立しないときは 0 が入ります。 EQ: 等しいとき真 LT: カレントレジスタ < 変数のとき真 GT: カレントレジスタ > 変数のとき真 ------------------------------------------------------------------------------- ADDVAR <変数番号> SUBVAR <変数番号> ANDVAR <変数番号> ORVAR <変数番号> XORVAR <変数番号> MULVAR <変数番号> DIVVAR <変数番号> MODVAR <変数番号> SLVAR <変数番号> SRVAR <変数番号> ------------------------------------------------------------------------------- Global 変数にカレントレジスタの値を加算(ADDVARの場合)します。 またはそれぞれの演算を行います。結果は変数に格納されるのでカレント レジスタの値は変わりません。演算は 32bit 符号付で行われます。 ADDVAR: GVAR(imm)+= CUR SUBVAR: GVAR(imm)-= CUR ANDVAR: GVAR(imm)&= CUR ORVAR: GVAR(imm)|= CUR XORVAR: GVAR(imm)^= CUR MULVAR: GVAR(imm)*= CUR DIVVAR: GVAR(imm)/= CUR MODVAR: GVAR(imm)%= CUR SLVAR: GVAR(imm)<<= CUR SRVAR: GVAR(imm)>>= CUR ------------------------------------------------------------------------------- ADD <定数> SUB <定数> AND <定数> OR <定数> XOR <定数> ------------------------------------------------------------------------------- カレントレジスタに対して定数演算を行います。 ------------------------------------------------------------------------------- IF_TRUE <ラベル番号> ------------------------------------------------------------------------------- カレントレジスタの値が 0 以外だった場合に指定のラベルに飛びます。 TESTSYSFLAG、TESTGSTATE、TESTVSTATE 等と組み合わせることで、任意 の bit の判定が可能になります。また CMP_EQ や SUB 等の演算命令を 使うと値の比較ができます。 ------------------------------------------------------------------------------- IF_FALSE <ラベル番号> ------------------------------------------------------------------------------- カレントレジスタの値が 0 だった場合に指定のラベルに飛びます。 TESTSYSFLAG、TESTGSTATE、TESTVSTATE 等と組み合わせることで、任意 の bit の判定が可能になります。また CMP_EQ や SUB 等の演算命令を 使うと値の比較ができます。 ------------------------------------------------------------------------------- IF_DOWN <ラベル番号> ------------------------------------------------------------------------------- キーによる関数呼び出し時に、それが KEYDOWN の呼び出しなのか KEYUP の 呼び出しなのか判定します。 この命令は WM_KEYDOWN または WM_SYSKEYDOWN だった場合に指定のラベル に飛びます。 ------------------------------------------------------------------------------- IF_UP <ラベル番号> ------------------------------------------------------------------------------- キーによる関数呼び出し時に、それが KEYDOWN の呼び出しなのか KEYUP の 呼び出しなのか判定します。 この命令は WM_KEYUP または WM_SYSKEYUP だった場合に指定のラベル に飛びます。 ------------------------------------------------------------------------------- IF_DIFFTIME <ラベル番号> ------------------------------------------------------------------------------- SAVETIME 実行した時間から、どれくらい時間が経っているか判定します。 SETDIFFTIME で設定した時間より過ぎている場合は指定のラベルに飛びます。 この命令の直前で SETDIFFTIME を呼び出すことで、判定ごとに異なる 判定値を用いることができます。 ------------------------------------------------------------------------------- IF_VSTATE0 <ラベル番号> IF_VSTATE1 <ラベル番号> IF_VSTATE2 <ラベル番号> IF_VSTATE3 <ラベル番号> ------------------------------------------------------------------------------- VSTATE の bit0〜3 が ON だった場合に指定のラベルに飛びます。 例えば IF_VSTATE0 は TESTVSTATE 0 IF_TRUE に相当します。 ------------------------------------------------------------------------------- IF_CTRL <ラベル番号> IF_SHIFT <ラベル番号> IF_RWIN <ラベル番号> IF_GSTATE3 <ラベル番号> ------------------------------------------------------------------------------- GSTATE の bit0〜3 が ON だった場合に指定のラベルに飛びます。 例えば IF_SHIFT は TESTGSTATE 2 IF_TRUE に相当します。 ------------------------------------------------------------------------------- string <文字列番号> "文字列定義" [ "追加文字列定義" ] ------------------------------------------------------------------------------- 文字列を定義します。文字列番号は 0〜3 まで指定することができます。 <文字列番号> で指定した番号のレジスタに文字列を代入します。 何度でも代入することができるので、一時的なバッファとして使います。 ほぼ 0 しか使いません。0 固定と思って差し支えありません。 <例> string 0 "\Program Files\bin\editor.exe" EXEC 0 上記の命令は 文字列番号 0 に登録した editor.exe を実行します。 追加文字列定義は無くてもかまいません。 この命令はデコーダが特別扱いするので define によるリネームはできません。 ------------------------------------------------------------------------------- MESSAGE <文字列番号> ------------------------------------------------------------------------------- 指定した文字列をポップアップの MessageBox に表示します。 エラーメッセージの表示やデバッグに使います。 文字列の後ろに付く数値は現在のカレントレジスタの値です。 例 string 0 "debug cur=" MESSAGE 0 ------------------------------------------------------------------------------- SETHELP ------------------------------------------------------------------------------- string の 0 番をヘルプメッセージとして登録します。登録したヘルプ メッセージは em1key の設定ダイアログに表示します。 6行分 (0〜5) 設定可能で、0 番は script のタイトルになります。 メッセージには %d, %x 等の C言語フォーマット記号を最大4つまで指定 できます。それぞれ Global 変数の 0〜3 が対応します。 リアルタイムに書き換えできるので、デバッグやモード切替などの状態を 表示するために使うこともできます。 例 string 0 "[0]=ESC" SETHELP 1 string 0 "var0=%d var1=%d" SETHELP 2 ------------------------------------------------------------------------------- CLEARALLSTATE 0 ------------------------------------------------------------------------------- 引数は意味を持ちません。内部状態をクリアします。 初期化以外では使いません。 ------------------------------------------------------------------------------- SETTABLE ------------------------------------------------------------------------------- キーテーブルを切り替えます。TALBE_〜 のシンボル値と TABLEID は異なっ ているので注意してください。現在 TABLEID_DEFAULT と TABLEID_EXT 以外 の値を指定することはできません。値が範囲外だった場合この命令は無視 します。 TABLEID_DEFAULT TABLEID_EXT キーテーブルを切り替えると、キーを押したときの呼ばれるスクリプト関数 がいっぺんに入れ替わります。 ------------------------------------------------------------------------------- ◎環境依存命令 EXEC <文字列番号> ------------------------------------------------------------------------------- 任意のプログラムを実行します。実行するプログラム名はあらかじめ string 命令で登録しておく必要があります。 例 string 0 "\Program Files\bin\editor.exe" "-s" EXEC 0 文字列は 2 つ記述することが可能です。最初がプログラム名で、2つ目が コマンドラインに渡す引数とみなされます。 引数文字列は無くてもかまいません。 また exe 以外にも .html など関連付けされているファイルをそのまま実行 することができます。 ------------------------------------------------------------------------------- WINCMD <コマンド番号> ------------------------------------------------------------------------------- 特殊な Window コマンドを実行します。これらの命令の実行は非同期に行 われます。この命令を実行しても、その次の命令のタイミングで動作が 結果が完了しているとは限りません。 <コマンド番号> WINCMD_CLOSE アクティブなウィンドウを閉じます。WM_CLOSE を送信し ます。 WINCMD_ALTTAB タスク切り替えを行います。 WINCMD_IMESW IME の on/off を切り替えます。ただの切り替えだけなら ば次のキーシーケンスでも同じことが可能です。 RAWDOWN VK_LMENU SENDKEY VK_KANJI RAWUP VK_LMENU ただし上記キーシーケンスだと IME に未確定文字列が あっても off にできるので内容が消えてしまいます。 この命令は、キーバッファに未確定文字が存在する場合 は呼び出しても IME が off にならないので、入力した 文字列を間違って消してしまうことがありません。 また切り替え後の IME の状態を SYSFLAG_IME に反映させ ます。 WINCMD_GETIMEMODE IME が現在 on なのか off なのかを調べて SYSFLAG_IME に反映させます。なおこの動作はスクリプトと非同期に行 われるので、呼び出した直後すぐに SYSFLAG_IME が更新 されているとは限りません。 (WindowsMobile のみ、PCでは常に SYSFLAG_IME に状態が 反映されています) ------------------------------------------------------------------------------- ROTATE <回転番号> ------------------------------------------------------------------------------- 画面の回転を行います。(WindowsMobile のみ) <回転番号> 0〜3 画面を指定した向きに変更します。 4 現在の状態を元に画面の回転を行います。0〜3 まで順番に ------------------------------------------------------------------------------- ●変更履歴 2007/04/24 1.00 2007/04/27 1.10 間接アドレッシング命令 LOADIVAR, STOREIVAR, POPVAR, PUSHVAR 追加。特殊なGlobal変数の説明追加。DOWNVAR, UPVAR 命令追加。 SYSFLAG_IME 追加。WINCMD_GETIMEMODE 追加。TABLE_FUNC 0x01 の 自動呼出し追加。その他ドキュメント修正。 2007/04/28 1.20 PUSHIMM,CMPVAR,MULVAR,DIVVAR,MODVAR,SLVAR,SRVAR,CALLVARDEF, CALLVAREXT 命令追加。SYSFLAG_SCANVALID/ANY フラグ追加。 2007/05/04 1.21 SETHELP 追加。TABLE_DEFAULT/EXT 呼び出しはエラーを無視する よう変更。 2007/05/10 1.22 PC 版作成。ifce/ifpc/endif コマンドを追加した。 2007/05/12 1.22.1 説明の追記、修正のみ 2007/05/16 1.24 ifsw/ifnsw コマンドを追加した。VAR40 で TableID を取得できる ようになった。 2007/05/20 1.25 PC版のみ、隠す機能の改良 2007/05/23 1.25.1 (if系修正) 2007/08/11 1.26 W-ZERO3[es] WS011SH 対応。ifpc/ifce/ifsw/ifnsw 命令をネスト 可能にした。(最大32段) Hiroyuki Ogasawara http://dench.flatlib.jp/ http://www.vector.co.jp/authors/VA004474/