(2018年10月20日更新)
Zachtronicsの新作プログラミングパズルゲーム『EXAPUNKS』。
<EXAPUNKS – STEAM>
https://store.steampowered.com/app/716490/EXAPUNKS/
このゲームでPDFファイルで提供される付録雑誌「TRASH WORLD NEWS」14P-17Pに掲載されている、ゲーム内でウィルス作成に使用されるEXAのランゲージ・リファレンス・ガイドを日本語に訳してみました。ゲームを遊ぶ上で参考にしていただけましたら幸いです。
—[AXIOM]————————- EXAランゲージ・リファレンス・ガイド
EXAヴァーチャルマシン(EXA-VM)はホストコンピュータの共有ネットワークでの多数のエクセキューション・エージェンツ(EXAs)の履行を可能にします。ネットワーク内部で、EXAたちはあるホストから他のホストへ動的に創出、破壊、移動させることができます。EXA-VMは複数のEXAが同一ホスト内に位置している時でさえ、すべてのEXAを独立かつ同時に作動させることができます。
EXAのプログラムは一連の命令群より成り立っています。各命令は0個以上のオペランドを必要とします。各命令が必要とするオペランドを次の短縮形で指定します。
R
レジスタ
R/N
レジスタまたは-9999から9999の数値を示す
L
MARK命令によって定義されたラベル
—[レジスタ]—
X
Xレジスタは汎用の保存レジスタです。
T
Tレジスタは汎用の保存レジスタで数値及びキーワードを保存できます。また、TEST命令の対象であり、条件付きジャンプ(TJMP及びFJMP)の基準となるレジスタです。
F
FレジスタはEXAが保持しているファイルの内容の読み書きを可能にします。EXAがファイルをつかむ時、「ファイルカーソル」は当該ファイルの最初の値にセットされます。Fレジスタからの読み込みはこの値を読み込みます。即ち、Fレジスタにはこの値が上書きされます。Fレジスタへ読み書きが為された後、ファイルカーソルは自動的に次の値へ進みます。ファイルの最後の書き込みは、上書きされる代わりに新しい値に進みます。
M
Mレジスタは機能的にEXA同士のメッセージ受け渡しを制御します。(送信側の)EXAがMレジスタに値を書き込むと、他の(受信側の)EXAがそのMレジスタから読み込み、書き込まれた値を受け取るまで、(送信側の)EXAのメッセージ送出スロットに保存されます。両者の数値及びキーワードはこの方式によって交換することができます。
EXAがMレジスタに書き込む時、他のEXAから値が読み込まれるまで実行は一時停止になります。また、あるEXAがMレジスタから値を読み込む時、値を読み込めるようになるまで実行は一時停止されます。もし2つ以上のEXAが他のEXAから値を同時に読み込む場合、どのEXAが読み込みに成功するかは予測することができません。
デフォルトでは、EXAは同一ネットワーク内の他の全てのEXAと通信することができます。これはEXODUSインターフェイスのグローバル/ローカル切り替え設定、またはMODE命令の実行によって同一ホストに制限されるでしょう。たとえ同一ホスト内に存在するとしても、グローバルモードにあるEXAはローカルモードにあるEXAと通信することはできません。
—[ハードウェアレジスタ]—
EXA-VMが実行されているいくつかのホストでは、ハードウェアレジスタの使用を通じて接続されたハードウェアへのアクセスが提供されます。ハードウェアレジスタの有効名は#POWRや#ENABのような、ナンバー記号に4つの文字を続けたものです。ハードウェアレジスタの読み書き可、読み込みのみ可、書き込みのみ可などはホストの設定に依存します。
—[命令]—
値の操作
COPY R/N R
第1オペランドの値を第2オペランドにコピーします。
ADDI R/N R/N R
第1オペランドの値を第2オペランドの値に加えてその結果を第3オペランドで指定されたレジスタに保存します。SUBI(減算)、MULI(乗算)、DIVI(除算)、MODI(剰余算)命令も同様の書き方です。
SWIZ R/N R/N R
スウィズルマスクとして第2オペランドの値を用い、第1オペランドの値をスウィズル(かき混ぜる)し、その値を第3オペランドに指定したレジスタに保存します。スウィズル命令は下記に示すように数値の桁を再配置或いは抽出するのに使えます。
分岐
MARK L
ある行を指定したラベルに紐付けます。MARKは仮命令で実行されることはありません。
JUMP L
指定したラベルにジャンプします。
TJMP L
Tレジスタが1(または0より大きいいずれかの数値)である場合、指定したラベルにジャンプします。
これはTEST命令の結果が真である場合に相当します。
FJMP
Tレジスタが0である場合、指定したラベルにジャンプします。これはTEST命令の結果が偽である場合に相当します。
値のテスト
TEST R/N = R/N
第1オペランドの値と第2オペランドの値を比較します。
もし値が等しければ1を、等しくなければ0をTレジスタにセットします。大小比較テスト(”<(小なり)”または”>(大なり)”)も同じ書き方になります。
ライフサイクル
REPL L
当該のEXAのコピーを作成してコピーしたEXAの指定したラベルにジャンプします。
REPL命令を実行した時にEXAがファイルを保持している場合はそのファイルはコピーされず、コピー元のEXAが保持したままになります。
HALT
当該のEXAを終了させます。ファイルを保持している場合、そのファイルは落とされます。
KILL
同一ホスト内にある他のEXAを終了させます。同じユーザーによって作成されたEXAが優先されます。ターゲットが2つ以上ある場合、どれが選択されるかは予測できません。
ムーブメント
LINK R/N
指定したIDのリンクを渡ります。
HOST R
現在のホストの名称を指定したレジスタにコピーします。
通信
MODE
Mレジスタのグローバルモードとローカルモードの切り替えを行います。
VOID M
Mレジスタの値を読み込んで無効にします。
TEST MRD
当該のEXAが他のEXAから一時停止することなく読み込める場合は1を、そうでない場合は0をTレジスタにセットします。
ファイル操作
MAKE
新規ファイルを作成して掴みます。
GRAB R/N
指定したIDのファイルをつかみます。
FILE R
指定したレジスタに保持したファイルのIDをコピーします。
SEEK R/N
指定した数値の分だけファイルカーソルを前(正数)或いは逆(負数)に進めます。SEEK命令によりファイルカーソルが先頭或いは終わりを越える場合は、そこに固定されます。従って、-9999または9999の値を使えば先頭或いは最後に確実に移動させることができます。
VOID F
現在保持しているファイルからファイルカーソルでハイライトされた値を削除します。
DROP
現在保持しているファイルを落とします。
WIPE
現在保持しているファイルを削除します。
TEST EOF
ファイルポインタが保持しているファイルの最後に位置している時、Tレジスタに1をセットします。そうでない時はTレジスタに0をセットします。
NOTE
NOTEは仮命令であり、後ろに続くテキストはコンパイル時に無効となります。コード上に記録する「コメント」として使用することが可能です。
NOOP
1サイクル何も行いません。
RAND R/N R/N
第1オペランドと第2オペランドの値の間(それぞれのオペランドの値を含む)で乱数を発生し、結果を第3オペランドのレジスタに保存します。
(訳者注:RAND命令は一部のステージでしか使用できません。その際はRAND命令入力時に赤線が引かれ、マウスオーバーした時に注意書きが表示されます。)