レジスタ(スクリプト変数)

「猫の手」ではスクリプトで使用する変数の事を「レジスタ」と呼称して区別しています。
スクリプト作業上では「変数」 と呼んで指し障りありませんのでそうしていますが、
プログラムからスクリプト変数を指す時にプログラム上の変数と区別するために「レジスタ」と呼んでいます。

変数にアクセスする流れ

スクリプト変数の実体CJobInfo クラスにあります。

sam07_01.png

この配列に変数の値が入っています。
処理を追っていくよりも検索をかけた方が早いでしょう。

sam07_02.png
それぞれ値をセットしている所と、返している所、それっぽいのが出てきました。

CJobInfo クラスの中でやっています。
CJobInfoCRegister を継承していると先に触れました。

CRegister の仮想関数である

sam07_03.png
をオーバーライドする事で変数に対する処理を書いています。

アクセス部分のソース

REGISTER_DATA _pReg に変数のIDが渡されてきます。

sam07_04.png

Write
sam07_05.png

Read
sam07_06.png

codeH codeL の8bitに分けているのはカテゴリーを分けられるようにしているだけです。

sam07_07.png
と1つにまとめて全体通しIDで管理する事もできます。

サンプルでは固定変数(初めから決められている変数)と自由変数(スクリプトで宣言できる変数)にカテゴリー分けしています。

自由変数

自由変数の ID は mlc.ini で設定される

sam07_08.png
で決められます。

REG_VALUE_MAX は個数です。上記設定では 255を超えて変数を使用するとエラーとなります。

REG_VALUE の値がソースコード中の CODE_REG_VALUE と一致しています。

sam07_09.png

_HI マクロで上位ビットを取り出して codeH と比較しています。
#define  _HI(_val) (_val / 0x100)

codeL がそのまま配列の添え字に対応しています。

自由変数の場合、codeL に何が割り当てられるかは「猫の手」任せです。
プログラムからはスクリプト中の何という変数名に何が保存されているか等の情報はわかりません。

固定変数

プログラム、スクリプト間でデータの受け渡しをしたい場合は固定変数を使います。
サンプルではヘッダーで指定されています。

sam07_10.png

 int(0x0102:0) DATA_J
だと 変数 DATA_J にアクセスした場合 codeH に 0x01、codeL に 0x02 が格納されて送られます。

変数にアクセスした時の流れは以下です。

sam07_11.png


 int(0x0107:2) DATA[8]
では DATA を配列として登録しています。:2 はコメントにあるように 2:配列のみ を示しています。
単体で使用するとエラーとなります。
配列の添え字は最大 8 です。超えた値を指定するとエラーになります。

DATA[ 4 ] にアクセスした時の流れは以下です。

sam07_12.png

配列 8つ分のデータも m_iRegWork の中に入れているので次のIDは 0x0107 + 8 の 0x010f になります。
 int(0x010f:1) DATA_X[8]

属性 1:配列可 は添え字を指定しなくてもエラーにならず、アクセス時、_pReg->offset には -1 が格納されます。


サンプルでは配列も全て m_iRegWork に格納しているので、IDが被らないよう注意が必要ですが
m_iRegData[], m_iRegDataX[] という変数を作って個別に管理する事も可能です。
その場合はハードコーディングされた配列となり、スクリプト側からの自由度は損なわれるので用途に応じて使い分けてください。

sample03.mlc
は変数、配列を使用した例です。
exec03.bat を実行するとテストできます。

ReadRegister, WriteRegister にブレークを張りながら動作を確認すると分かりやすいでしょう。

章締


コードを作成する際に変数名も含めてコード化し、プログラム側からスクリプト変数に簡単アクセスできるスクリプトシステムも存在しますが
やはりコードが大きく、処理負荷も大きくなってしまいます。

スクリーンセーバーのフライングトースターのように小さなキャラクターが画面上を動き回るようなものの動きをスクリプトで作成しようとすると
キャラクターの数が 1000, 2000 となると、「斜めに移動して画面端に来たら最初に戻る」という単純な座標演算でも物凄い負荷がかかってしまいます。

この「猫の手」は元々そういう多くの小物をスクリプト制御する事を前提に設計されているため、処理負荷を小さくするよう設計されています。

しかし「猫の手ver1.0」ではこういったレジスタを扱うシステムはありませんでした。
コマンドにパラメータを与える事が出来るだけでしたが、それでもフライングトースターのようなキャラクター制御にも利用されていました。

その方法は定数パラメータに「-32700 以下の値が指定されたらそれに対応する変数として解釈する」というもので
#define  DATA_I  -32700
#define  DATA_J  -32701
というように define する事で変数名を扱っているよう見せるものです。

これはスクリプトシステムに「期待する機能がないからできない」のではなくスクリプトシステムというのは「工夫次第でどうとでる使える」
という一例です。

そういった本来ない機能をカスタマイズによって実現するというのも面白さの1つです。