2011/04/07 Assembly Desk
以下は検討中の項目
USBキーボード/マウス/ジョイパッドの一連の入力処理を記述する為のスクリプト仕様について定める。
このスクリプト仕様は、USBキーボード/マウス/ジョイパッドで可能な全ての操作を忠実に再現する事よりは、むしろ、8bitマイコンに実装しやすい形の記述を目指している。
また、外付けスイッチをひとつだけ搭載している事を想定している。
また、このスクリプトをどの様に動作させるか(スイッチを押したときに動作/押している時に動作)等のスクリプトに対するメタ情報も含めて定めている。
このスクリプト仕様策定時、Microchip社製マイコンであるPIC18F14K50 / PIC18F2550に実装する事を強く意識している。
スクリプトはヘッダ部、ボディ部、及びフッタ部からなる。
それぞれを区切るセパレータは特に用意しない。
スクリプト記述時に、ヘッダ部・ボディ部・フッタ部の順に記述される事が望まれ、この順番を守らなかった場合の動作は処理系(実装)依存となる。
各命令は以下の組み合わせで表現される。
ただし、[オペランド部]は以下いずれかで表現される。
ヘッダ部では、スクリプト自体の動作のさせかたを記述する。
例えば、スイッチを押した時に、スクリプトがどの様に実行されるか、「押したら一回だけ実行」「次に押されるまで実行」等、スクリプト自体の動作のさせかた(メタ情報)を記述する。
ここでは、スクリプトの実際の動作を記述する。
ここが、スクリプトの最後である事を示す。
スクリプトの実行のさせ方を定める命令。
[オペコード][オペランド]の構成を取る。
オペコードは0xFE。オペランドと動作の対応は以下の通り。
オペランド | 動作 |
0x00 | 対応するSWが押される度、一度だけ動作する(デフォルト) |
0x01 | 対応するSWが離されると、一度だけ動作する(未実装) |
0x02 | 対応するSWによらず、一度だけ動作する(未実装) |
0x03 | 対応するSWによらず、動作を繰り返す(未実装) |
0x04 | 対応するSWが押されている間動作し、一度離されると動作は初めに戻る(未実装) |
0x05 | 対応するSWが押されている間動作し、動作はリジュームされる(未実装) |
ヘッダ部が省略された場合、デフォルトが選択される。
スクリプトの動作周期を変更する。変更した動作周期はこの後に記述される命令に適用される。
また、この命令が解釈された時に実行中のコマンドに対しては影響しない。
[オペコード][オペランド]の構成を取る。
動作周期をms単位で1ms~256msの間で指定する。
オペコードは0x80。オペランドに何msかが入る。
0msを指定すると、256msとなる。
動作周期を100ms単位で100ms~25.6sの間で指定する。
オペコードは0x81。オペランドに何百msかが入る。
0msを指定すると、25.6sとなる。
動作周期を10s単位で10s~2560sの間で指定する。
オペコードは0x82。オペランドに何十sかが入る。
0msを指定すると、2560sとなる。
次の命令を実行する前に、指定された時間だけウェイトをおく。
ここでの待ち時間の間も、現在キューに入っている命令は実行される。
[オペコード(0x90)]の構成を取る。
現在の動作周期設定の時間だけ、ウェイトする。
現在キューに入っている命令が全て終わるまでウェイトする。
各種マウスの動作をさせる。
マウスをx方向に移動に移動させる。
設定した移動量を設定した回数だけ実行する。
移動量は現在の動作周期設定で決定される。
[オペコード(0x10)][オペランド1][オペランド2]の構成を取る。
オペランド1に移動量を設定する。0x80~0x7F。
オペランド2に回数を設定する。0~256。(0を設定すると256回となる)
負の移動量で左方向、正の移動量で右方向に動く。
例 マウスを1msおきに1dotづつ左に100回移動させる。
0x80 0x01 0x10 0x01 0x64
例 マウスを20msおきに3dotづつ右に33回移動させる。
0x80 0x14 0x10 0xFD 0x21
マウスをy方向に移動させる。
設定した移動量を設定した回数だけ実行する。
移動量は現在の動作周期設定で決定される。
[オペコード(0x11)][オペランド1][オペランド2]の構成を取る。
オペランド1に移動量を設定する。0x80~0x7F。
オペランド2に回数を設定する。0~256。(0を設定すると256回となる)
負の移動量で上方向、正の移動量で下方向に動く。
ホイールを動かす。
設定した移動量を設定した回数だけ実行する。
移動量は現在の動作周期設定で決定される。
[オペコード(0x11)][オペランド1][オペランド2]の構成を取る。
オペランド1に移動量を設定する。0x80~0x7F。
オペランド2に回数を設定する。0~256。(0を設定すると256回となる)
負の移動量で上方向、正の移動量で下方向にホイールを動かす。
マウスの左ボタンを押す。
[オペコード(0x14)]の構成を取る。
現在の動作周期の時間だけ押される。
マウスの右ボタンを押す。
[オペコード(0x15)]の構成を取る。
現在の動作周期の時間だけ押される。
マウスのホイールボタンを押す。
[オペコード(0x14)]の構成を取る。
現在の動作周期の時間だけ押される。
各種キーボードの動作をさせる。
キーコードの入力を行う。
[オペコード(0x20)][オペランド]の構成を取る。
オペランドで指定したキーコードを、現在の動作周期の時間だけ押し続ける。
なお、オペランドで指定するキーコードは「USB キーコード」等で検索し探す。
モディファイアの入力を行う。(CTRL / SHIFT等)
[オペコード(0x21)][オペランド]の構成を取る。
オペランドで指定したモディファイアを、現在の動作周期の時間だけ押し続ける。
なお、オペランド1で指定するモディファイアの対応は以下のとおり。
0bit目 | 左CTRL |
1bit目 | 左SHIFT |
2bit目 | 左ALT |
3bit目 | 左WIN |
4bit目 | 右CTRL |
5bit目 | 右SHIFT |
6bit目 | 右ALT |
7bit目 | 右WIN |
スクリプトの最後を表す。
この命令が解釈された時、実行中のコマンドは最後まで実行される。
[オペコード(0xFF)]の構成を取る。
デバイスを挿し込むと、1sに一回右クリックを1msだけ押す。サンプルを書く。
0xFE //スクリプト実行制御(オペコード)
0x03 //対応するスイッチによらず動作し続ける(オペランド)
0x81 //動作周期を100msに単位で(オペコード)
0x0A //動作周期を1sに(オペランド)
0x90 //一定時間ウェイト(1s待つ)
0x80 //動作周期をms単位で(オペコード)
0x01 //動作周期を1msに(オペランド)
0x14 //右クリック
0xFF //終了