GMC-4の KA
命令は、現在押されているキーの情報を受け取る命令である。
この KA
命令の仕様が、実機
- FX-マイコン
- GMC-4
- ORANGE-4 (Ver 1.09)
と、シミュレータ
- FX-マイコン シミュレータ (Version1.3)
- GMC-4 シミュレータ (version 1.39)
で異なっていることがわかったので、ここで報告する。
検証方法
以下のプログラムを実行する。
機械語 プログラム
start:
8 0 TIA 0 ; Aレジスタの値を0にする
0 KA ; キー入力を読み込む
1 AO ; Aレジスタの値を7セグメントLEDに出力する
F 0 0 JUMP start ; 最初に戻る
実機での動作
キーを押すと7セグメントLEDの表示が押したキーの番号になり、
キーを離すと7セグメントLEDの表示は0に戻った。
すなわち、KA
命令はキーが押されていないときはAレジスタの値を変更しない。
シミュレータでの動作
キーを押すと7セグメントLEDの表示が押したキーの番号になり、
キーを離しても7セグメントLEDの表示は押したキーの番号のまま変わらなかった。
すなわち、KA
命令はキーが押されていないときはAレジスタの値を前回押されたキーの番号に設定する。
実際の実行の様子
5種類の環境それぞれで実行した様子を、1本の動画にまとめた。
追加検証
前述の検証で、実機3種類ではキーを押していないとき KA
命令の後のAレジスタの値は0となった。
これは、「Aレジスタの値が維持される」以外に、「Aレジスタの値が0になる」という仕様の可能性もある。
そこで、KA
命令を実行する前にAレジスタの値を0ではなく1に設定するプログラムを実行してみた。
機械語 プログラム
start:
8 1 TIA 1 ; Aレジスタの値を1にする
0 KA ; キー入力を読み込む
1 AO ; Aレジスタの値を7セグメントLEDに出力する
F 0 0 JUMP start ; 最初に戻る
すると、今回の3種類の実機全てにおいて、キーを離したときの7セグメントLEDの表示は1になった。
したがって、KA
命令は「キーを押していないとき、Aレジスタの値を0にする」という仕様ではないことがわかった。
次に、「Aレジスタの値を、前回の TIA
命令で設定した値に設定する」という可能性を検証するため、以下のプログラムを実行した。
機械語 プログラム
start:
A 3 TIY 3 ; Yレジスタの値を3にする
8 2 TIA 2 ; Aレジスタの値を2にする
3 CY ; AレジスタとYレジスタの値を入れ替える
0 KA ; キー入力を読み込む
1 AO ; Aレジスタの値を7セグメントLEDに出力する
F 0 0 JUMP start ; 最初に戻る
すると、今回の3種類の実機全てにおいて、キーを離したときの7セグメントLEDの表示は3になった。
よって、「前回のTIA
命令で設定した値に設定する」という仕様でもないことがわかった。
「前回の AIA
命令で設定した値」など、他の可能性も考えられるが、
そうなるとこれまでの検証用プログラムで使用していない命令を参照することになり、不自然になる。
よって、「実機の KA
命令は、キーが押されていないとき、Aレジスタの値を変更しない」と考えるのが自然だろう。
余談
FX-マイコンシミュレータは「マイコンユニットの動作をできるだけ忠実に再現しました」と主張しているが、
ここは再現できなかったのですね…
GMC-4 シミュレータ、アプリケーションの Help → About で確認するとちゃんと version 1.39 なんだけど、
ドキュメントには Version 1.38 って書いてあるんだよなあ…
コードを読んだ結果、以下の実装の KA
命令はキーが押されているときのみAレジスタの値を変更する仕様のようである。